令人沮丧的问题是 cron 和 su -c 都没有运行我的工作(权限?)

Owe*_*ker 5 cron permissions

更新(和剪断)下面的更多详细信息。

我已经设置了一个 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.logstderr.log。没有邮件发送给我,其中的其他文件/var/log/都没有在正确的时间范围内有任何条目,我想知道去哪里查看出了什么问题

der*_*ert 6

首先,当 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)

看看这是否有效。


Owe*_*ker 0

我已经找到问题了。我发送到的-C 命令行开关本来php应该是-c。我不知道为什么cron不以任何crontab方式向我报告这一点,更不用说一种有用的方式(或者我如何设法用大写 C将其放入,但在 CLI 上用小写进行测试),但是运行再次在 CLI 中与一位同事一起充当我的猴子,突然之间就很明显了。

现在我感觉自己多么愚蠢?

好吧,至少现在已经解决了,并且cron正在愉快地运行我该死的脚本。感谢大家的帮助。