我在几个不同的 Linux 发行版(Fedora 11、CentOS 5 和 SuSE 10.2)上运行,经常遇到一个问题:我想要作为 cron 作业运行的新脚本在直接从命令行调用时运行良好,但由于 PATH 或其他所需环境变量的细微变化,从 cron 调用时会失败。
有没有办法可以测试运行单个脚本,就像它是从 cron 运行一样,而不必运行整个 crontab 或使用 run-parts 运行整个 cron.daily/.hourly 等目录?我想我可以暂时编辑我的 crontab 以在接下来的几分钟内运行脚本,但我宁愿有一个更独立的解决方案,这样我就不会冒弄乱 crontab 的风险。
答案1
从谷歌搜索在path in crontab
root@pingu # cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
您基本上想要设置 PATH,然后就不必担心变化了。此外,快速测试是使用相同的环境变量通过 SSH 在所有机器上运行脚本。
答案2
如果我正在运行单独安排的 cron 作业(crontab 中的单独一行),我会在测试时将其安排为每分钟或每隔一分钟执行一次。测试完成后,我会编辑 crontab 行,使其按我想要的频率运行。
附注:如果我想测试 cron 本身是否正常工作,并将结果通过电子邮件发送到正确的地址(非常重要),我会将以下行添加到我的 /etc/crontab:
* * * * * root ls /doesnotexistfoobar
每分钟运行一次,并尝试对ls
不存在的目录执行操作。应该每分钟通过电子邮件发送失败消息。当我让它正常工作时,我会注释掉该行。
回到你的问题:你可能不想修改现有的 cron 作业以使其经常运行,因为有可能忘记将其改回来,而且经常运行 cron.hourly、cron.daily 或 cron.whatever 可能会产生副作用,具体取决于你在其中的内容。为了确保你在从 cron 调用时所在的相同环境中运行脚本,我建议修改上面的“ls”技巧:
在您的 crontab 中添加一行以直接运行脚本:
* * * * * root /etc/cron.hourly/customscript
这样,您就可以根据需要频繁运行它进行测试。
答案3
我不知道更直接的解决方案,但您可以创建一个具有脚本权限的用户(例如,crontest),并使用“crontest”用户的用户特定 crontab 来测试脚本,通过编辑它让脚本在接下来的几分钟内运行。