更新(和剪断了),更多详细信息如下。
我已经设置了一个 cron 脚本,我正在尝试调试它没有运行的原因。[剪掉上下文测试,这一切都可以;参见修订版 2详情]命令本身(如果有帮助的话)(箭头表示换行以便于阅读)是:
/usr/bin/php -C /etc /path/to/process.php
↪ >>/path/to/stdout.log 2>>/path/to/stderr.log
[权限测试被剪掉,没问题;见下文和修订版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
更新#1于 2012-02-08 12:32 Z
[截图:已经尝试过德罗伯特的建议(修订版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
任务,将完整路径传递给/bin/echo
.刚刚尝试过,它也不起作用,也没有生成电子邮件,所以我不知所措。
更新#2发表于 2012-02-08 19:15 Z
非常有用的聊天对话和奥赫斯林,看来问题出在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
我通过添加以下行来解决这个问题/etc/shadow
:
cronuser:*:15217:0:99999:7:::
正如我发现的在论坛上,如果用户没有出现在 中/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
但现在/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)
并且没有任何内容进入stdout.log
或stderr.log
。没有邮件发送给我,并且其他文件中/var/log/
没有任何条目在正确的时间范围内,并且我已经没有想法去哪里查看出了什么问题
答案1
首先,当 cron 作业失败时,cron 会发送电子邮件。默认情况下,这是 cron 作业的所有者。因此,这些电子邮件可能会发送到 cronuser@localhost 或 root@localhost。检查那些电子邮箱。或者,您可以通过将其放在MAILTO=email@domain
crontab 文件的顶部来指定邮件的发送位置。 (实际上,我看到你把它放在MAIL=""
crontab 的顶部。至少根据man 5 crontab
我的机器,它应该是MAILTO
。而你不当试图找出它不起作用的原因时想扔掉错误消息!)
其次,cron 使用/bin/sh
.如果需要 bash 扩展,请设置SHELL=/bin/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
全面检查权限。cronuser
例如,父目录中可能缺少 +x。 (我想你也应该检查 /usr/bin/php ,但我认为这是正常的)
您还可以尝试在最小环境中运行该命令:
# su -s /bin/sh -u cronuser
$ env - /bin/sh
$ /usr/bin/php -C /etc /path/to/process.php
看看是否有效。
答案2
在crond
跑?
尝试以下命令之一:
pidof crond
pgrep -l crond
ps caxf | grep -6 crond --color
最后一个命令的输出:
11881 ? S 0:00 \_ httpd
11882 ? S 0:00 \_ httpd
11883 ? S 0:00 \_ httpd
11884 ? S 0:00 \_ httpd
11885 ? S 0:00 \_ httpd
11886 ? S 0:00 \_ httpd
2098 ? Ss 0:01 crond #this 'crond' is in red
2125 ? Ss 0:00 sudoscriptd
2127 ? Ss 0:00 \_ sudoscriptd
2136 tty2 Ss+ 0:00 mingetty
2137 tty3 Ss+ 0:00 mingetty
2138 tty4 Ss+ 0:00 mingetty
2139 tty5 Ss+ 0:00 mingetty
配置是什么crond
?
检查您的/etc/rc.d/init.d
或/etc/init.d
任何启动文件。
配置crond
可以列出被拒绝或/和允许用户。
是您的用户吗被拒绝?检查这些文件:
/etc/cron.allow
/etc/cron.deny
如果两个文件都不存在,则只有 root允许。
如果cron.allow
不存在并且cron.deny
为空,则所有用户都是允许默认情况下。
该文件/etc/crontab
必须只能由 root 写入:
$ ls -l /etc/crontab
-rw-r--r-- 1 root root 255 Jul 15 2006 /etc/crontab
说什么crond
?
接收信息的自然方式crond
是本地邮件。crond
通常使用sendmail
.如果sendmail
不可用,可以给出另一个邮件命令(CRONDARGS="-mmail"
)。
但现阶段,最好是直接检查crond
日志( ll /var/log/cron*
)。
重新开始crond
该问题可能会在重申时得到解决crond
...
如果问题仍然存在,那么在再次重新启动之前,让我们在不使用init.d
或 的情况下运行它service
,并尝试其他选项:
须藤 crond -p -x sch
并再次检查crond
日志文件...