Cron 权限?

Cron 权限?

我有一个 bash 脚本,如果我手动运行它(以 root 身份),它会毫无问题地执行所有任务。这些任务只是几个 php 脚本,然后是“mv”将进程文件移动到临时文件夹。

问题是,当我将脚本作为 cron 作业运行时,出现以下错误:

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

该文件肯定存在,所以我猜想这是一个权限问题,但由于它位于 root 的 crontab 文件中,我不明白为什么它看不到该文件。有什么想法吗?

提前致谢!

脚本本身:

[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

那里的“mv”似乎是问题所在。但是该文件肯定存在:

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

import.php 文件也使用该文件并且它也无法“看到”该文件。

这是 root 的 crontab:

[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”:没有此文件或目录

我几乎可以肯定这是权限问题。cron“root”似乎无法“看到”这些文件,但如果我以 root 身份移动它们,或者以 su root 身份运行脚本,则脚本可以正确完成。

答案1

没有这样的文件或目录是一条明确消息,表示未找到该文件。权限问题将给出以下消息之一:

  • 不允许操作
  • 没有权限

因此,请仔细检查您的情况并提供更多信息,例如相关的源代码和 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

通过这种方式,您可以确保在调用时文件存在并且处于何种状态。

相关内容