Назад | Перейти на главную страницу

Cron разрешения?

У меня есть сценарий bash, который, если я запускаю вручную (как root), выполняет все свои задачи без проблем. Задачи - это всего лишь несколько сценариев php, а затем «mv» для перемещения файла процесса во временную папку.

Проблема в том, что когда я запускаю сценарий как задание cron, я получаю следующую ошибку:

mv: cannot stat `/var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv': No such file or directory 

Этот файл определенно существует, поэтому я предполагаю, что это проблема с разрешениями, но поскольку он находится в файле crontab root, я не понимаю, почему он не может видеть файл. Любые идеи?

Заранее спасибо!

Сам скрипт:

[root@cartman jupiter]# cat /opt/triggers/jupiter/jupiter_manager_trigger.sh 
#!/bin/bash
php /opt/triggers/jupiter/php/import.php > /var/log/triggers/jupiter_`date +%Y%m%d`_import.log
php /opt/triggers/jupiter/php/update.php > /var/log/triggers/jupiter_`date +%Y%m%d`_update.log
php /opt/triggers/jupiter/php/export.php > /var/log/triggers/jupiter_`date +%Y%m%d`_export.log
php /opt/triggers/jupiter/php/upload.php > /var/log/triggers/jupiter_`date +%Y%m%d`_upload.log
mv /var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv /var/sftp/jupiter_sftp/processed/`date +%Y%m%d`_Yesterday_email_addrs.csv

Кажется, проблема в том "мв". Однако этот файл ОБЯЗАТЕЛЬНО существует:

[root@cartman jupiter]# ls /var/sftp/jupiter_sftp/incoming/
Yesterday_email_addrs.csv

Файл import.php также использует этот файл, и он тоже не может его «видеть».

Вот crontab для root:

[root@cartman jupiter]# crontab -u root -l
* * * * * cd /var/www/sugar; php -f cron.php > /dev/null 2>&1
0 10 * * * sh /opt/triggers/jupiter/jupiter_manager_trigger.sh
10 4 * * * sh /opt/scripts/s3backup_www.sh
0 4 * * * sh /opt/scripts/mysql_backup.sh

Вот соответствующая часть файла import.php:

$load="LOAD DATA LOCAL INFILE '/var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv' 
INTO TABLE Managers
FIELDS TERMINATED BY ',' 
ENCLOSED BY '\"' 
LINES TERMINATED BY '\r\n' 
IGNORE 5 LINES 
(Hotel,@ignore,@ignore,Title,FirstName,LastName,Email,@ignore);";

Похоже, проблема все еще существует. Mysql и mv не могут снова "увидеть" файл сегодня, хотя он есть:

Sat, 09 Mar 2013 11:00:01 +0000
total 12
-rw-r--r-- 1 jupiter_sftp sftpusers 9590 Mar  9 00:55 Yesterday_email_addrs.csv
-rw-r--r-- 1 jupiter_sftp sftpusers 9590 Mar  9 00:55 /var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv

Вот ошибки из логов:

Data base error. MySQL writes: Can't get stat of '/var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv' (Errcode: 2)

mv /var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv /var/sftp/jupiter_sftp/processed/20130310_Yesterday_email_addrs.csv

mv: не может статистика `/var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv ': нет такого файла или каталога

Я почти уверен, что это проблема с разрешениями. Кажется, что «root» cron не может «видеть» эти файлы, но если я перемещаю их как root или запускаю скрипт как su root, скрипт завершается правильно.

Данный файл или каталог отсутствует явное сообщение о том, что файл не найден. Проблема с разрешением может дать одно из следующих сообщений:

  • операция не разрешена
  • Доступ запрещен

Поэтому, пожалуйста, дважды проверьте свою ситуацию и, возможно, предоставьте дополнительную информацию, например соответствующий исходный код и запись в crontab.

Хорошая идея для отладки вашей ситуации - обогатить jupiter_manager_trigger.sh со следующим кодом отладки.

{ date -R
  set -xv
  ls -l /var/sftp/jupiter_sftp/incoming/
  ls -l /var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv
  mv /var/sftp/jupiter_sftp/incoming/Yesterday_email_addrs.csv /var/sftp/jupiter_sftp/processed/`date +%Y%m%d`_Yesterday_email_addrs.csv
  set +xv
} >>/tmp/debug_jupiter.out

Таким образом вы гарантируете, что во время вызова файл существует и в каком состоянии он находится.