我创建了一个名为“forward_email.sh”的脚本,并将权限设置为 777。它包含以下行:
echo "It worked: $(date)" >> /home/noc/email.log
我使用以下行创建了一个 cron 作业:
*/5 * * * * /home/noc/forward_email.sh
问题是“email.log”文件从未改变。我甚至将权限设置为 666。当我手动运行脚本时,它运行正常。
cron 作业根据“/var/log/cron.log”文件运行。
有人能告诉我哪里出了问题吗?这是 Ubuntu Server 9.04 的最小虚拟机安装,通过 apt-get 安装 cron。
更新:我犯了一个非常愚蠢的错误。我将脚本命名为“forward_mail.sh”。直到我安装了一些电子邮件服务并收到来自 Cron 的以下错误电子邮件时,我才发现自己的错误。
/bin/sh: /home/noc/forward_email.sh: not found
我更改了文件的名称,现在可以正常工作了。
答案1
我的脑子里浮现出很多可能的事情。
你确定 crontab 条目确实指向你的脚本吗?例如,如果你想运行如下脚本~noc/bin/script.sh,但有一个像/home/noc/bin/脚本(即一个微妙的拼写错误)那么它当然不会起作用。我通常用鼠标将命令从 crontab 中复制出来,然后将其粘贴到命令提示符中来检查我的 crontab 条目,只是为了 100% 确保它会运行我想要它运行的内容。
你的脚本是否包含仅有的指定的行?通常你必须包括类似以下内容:
#!/bin/bash
...在脚本的顶部使其工作。
如果它比单线更复杂,你会当然编程逻辑是否允许它运行该特定线路?
尝试将脚本缩减为
#!/bin/bash
echo "Bing!" >> /tmp/cronjob
...看看会发生什么。如果成功,则说明您的 cron 脚本存在编程问题。如果失败,则说明您的 cron 存在问题。
'noc' 用户是运行该脚本的用户吗?如果不是,您确定运行 cron 脚本的用户可以通过 /home/noc 对 email.log 文件具有读/写权限吗?
运行 cronjob 的用户发送的错误电子邮件会发到哪里?会生成错误电子邮件,然后发送到你意想不到的地方,或者可能被完全丢弃吗?尝试运行 cronjob
#!/bin/bash
echo "Bing!"
...然后尝试弄清楚生成的电子邮件去了哪里。
cron.deny 和/或 cron.allow 是否起作用?如果 /etc/cron.allow 存在,则用户 noc 必须在其中列出;如果 /etc/cron.deny 存在。用户 noc 必须不是在其中列出。在 RedHat 上,如果 cron.allow 和 cron.deny 都不存在,则只有 root 用户才被允许使用 cron。
答案2
Cron 在运行时设置了有限的环境变量,尤其是您的$PATH
。尝试输入任何二进制文件的完整路径。因此/home/noc/forward_email.sh
应该是:
/bin/echo "It worked: $(date)" >> /home/noc/email.log
另外, */5
脚本开头做什么?*/5
每五分钟运行一次,5
每小时运行一次“整点过 5 分钟”。
5 * * * * /home/noc/forward_email.sh
#* * * * * command to be executed
#- - - - -
#| | | | |
#| | | | +----- day of week (0 - 6) (Sunday=0)
#| | | +------- month (1 - 12)
#| | +--------- day of month (1 - 31)
#| +----------- hour (0 - 23)
#+------------- min (0 - 59)
最后,您是否使用以下命令编辑并保存了 crontab:
crontab -e
...您的编辑器是由环境变量选择的吗$EDITOR
?
答案3
echo "It worked: $(date)" >> /home/noc/email.log
在运行脚本之前是否/home/noc/email.log
存在?运行 cron 作业的用户是否可以写入?如果事先创建它会发生什么?例如
touch /home/noc/email.log
chmod 666 /home/noc/email.log
答案4
如果您对脚本有任何疑问,请将以下行放在脚本顶部:
#!/bin/bash -x
(如果不用这个壳就放好的那个)
使用-x
(eX您可以使用“显式”选项,该选项将以调试模式运行整个脚本。在命令展开之后但在执行之前,每个命令及其参数的踪迹都会打印到标准输出中。