更新(和剪断)下面的更多详细信息。
我已经设置了一个 cron 脚本,我正在尝试调试它为什么没有运行。[剪切上下文测试,一切正常;有关详细信息,请参阅修订版 2 ]命令本身,如果有帮助,(箭头表示换行以提高可读性)是:
/usr/bin/php -C /etc /path/to/process.php
? >>/path/to/stdout.log 2>>/path/to/stderr.log
Run Code Online (Sandbox Code Playgroud)
[截取权限测试,一切正常;详情见下文和修订版 2 ]
检查crontab
(再次,包装为易读性),我得到:
[blackero@XXXXXXXXXXX to]$ sudo crontab -u cronuser -l
MAIL="blackero@localhost"
30 9 * * * cronuser /usr/bin/php -C /etc /path/to/process.php
? >>/path/to/stdout.log 2>>/path/to/stderr.log
20 18 7 * * cronuser /usr/bin/php -C /etc /path/to/process.php
? >>/path/to/stdout.log 2>>/path/to/stderr.log
22 18 7 * * cronuser echo "Test" > /path/to/test.txt
? 2> /path/to/error.txt
Run Code Online (Sandbox Code Playgroud)
在 2012-02-08 12:32 Z更新 #1
[剪辑:尝试过derobert的建议(修订版 3)],我知道cronuser
可以正确运行脚本并可以写入两个.log
文件。(process.php
脚本所做的第一件事是通过 FTP 下载文件;它也成功地做到了这一点。)但是,即使修复了该MAIL=""
行(通过删除它并将其更改为MAILTO="blackero@localhost"
),cron 任务仍然没有运行,也不会给我发送任何电子邮件。
一个朋友建议我重试
9 12 8 * * cronuser /bin/echo "Test" > /var/www/eDialog/test.txt
? 2> /var/www/eDialog/error.txt
Run Code Online (Sandbox Code Playgroud)
任务,在将完整路径传递给/bin/echo
. 刚刚尝试过,它也不起作用,也没有生成电子邮件,所以我不知所措。
在 2012-02-08 19:15 Z更新 #2
与oHessling 的一次非常有用的聊天对话,似乎问题出在pam
. 每次cron
尝试运行我的工作时,我都有/var/log/cron
条目:
crond[29522]: Authentication service cannot retrieve authentication info
crond[29522]: CRON (cronuser) ERROR: failed to open PAM security session: Success
crond[29522]: CRON (cronuser) ERROR: cannot set security context
Run Code Online (Sandbox Code Playgroud)
我通过添加以下行来解决这个问题/etc/shadow
:
cronuser:*:15217:0:99999:7:::
Run Code Online (Sandbox Code Playgroud)
正如我在论坛上发现的那样,如果用户没有出现在 中/etc/shadow
,则pam
不会继续处理安全请求。添加*
为第二列意味着该用户无法使用密码登录(因为未指定哈希值)。修复导致了不同的错误/var/log/cron
,因此,仔细检查我的crontab
我注意到我每次都指定了用户名。
更正这意味着我crontab
现在读到:
[blackero@XXXXXXXXXXX ~]$ sudo crontab -u cronuser -l
MAILTO="blackero@localhost"
30 9 * * * /usr/bin/php -C /etc /path/to/process.php
? >>/path/to/stdout.log 2>>/path/to/stderr.log
52 18 8 * * /usr/bin/php -C /etc /path/to/process.php
? >>/path/to/stdout.log 2>>/path/to/stderr.log
9 12 8 * * /bin/echo "Test" > /path/to/test.txt
? 2> /path/to/error.txt
Run Code Online (Sandbox Code Playgroud)
但现在/var/log/cron
向我展示:
Feb 8 18:52:01 XXXXXXXXXXX crond[16279]: (cronuser) CMD (/usr/bin/php -C /etc
? /path/to/process.php >>/path/to/stdout.log 2>>/path/to/stderr.log)
Run Code Online (Sandbox Code Playgroud)
并且没有任何内容进入stdout.log
或stderr.log
。没有邮件发送给我,其中的其他文件/var/log/
都没有在正确的时间范围内有任何条目,我想知道去哪里查看出了什么问题
首先,当 cron 作业失败时,cron 会发送电子邮件。默认情况下,这是针对 cron 作业的所有者。所以这些电子邮件可能会发送到 cronuser@localhost 或 root@localhost。检查那些邮箱。或者,您可以通过放置MAILTO=email@domain
在 crontab 文件的顶部来指定邮件的去向。(其实,我看你把MAIL=""
你的crontab的顶部,至少根据man 5 crontab
我的机器上,它应该是MAILTO
,你不要想试图弄清楚为什么它不工作时扔掉的错误消息!)
其次,cron 使用/bin/sh
. SHELL=/bin/bash
如果您需要 bash 扩展,请设置(再次,在 crontab 的顶部)。
第三,您还没有完全测试权限。您需要执行以下操作:
# su -s /bin/sh -u cronuser
$ touch /path/to/stdout.log
$ touch /path/to/stderr.log
$ cat /path/to/process.php > /dev/null
$ exit
Run Code Online (Sandbox Code Playgroud)
全面检查权限。cronuser
例如,父目录中可能缺少 +x。(我想你也应该检查 /usr/bin/php ,但我认为这是正常的)
您也可以尝试在最小环境中运行该命令:
# su -s /bin/sh -u cronuser
$ env - /bin/sh
$ /usr/bin/php -C /etc /path/to/process.php
Run Code Online (Sandbox Code Playgroud)
看看这是否有效。