日常Cron作业未运行


10

快速概览:我有一个脚本,该脚本每天将当天的SVN源代码存储库备份到tarball中。由于输出目录的所有权,我已经测试了该脚本,并且只要我以sudo身份运行它,它就可以很好地工作。

因此,问题在于我想每天运行一次,因此将其链接放在/etc/cron.daily目录中。这是目录的内容。

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

问题在于它根本无法运行。这是该脚本的权限:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

有想法吗?


2
如果可能的话,请考虑通过选择最佳答案(如果有的话)来关闭其他一些未解决的问题。我们需要用户保持他们的问题,以便该站点可以成为遇到问题的下一个人的有效工具。有关最佳做法的更多详细信息,请考虑阅读常见问题解答
布鲁诺·佩雷拉

Answers:


37

试过这个

run-parts --test /etc/cron.daily

发现我的文件update.ubuntu没有出现。还注意到我的文件具有扩展名(在其中带有点)。

解决此问题的步骤。

  1. 将我的update.ubuntu重命名为update-ubuntu
  2. 再一次run-parts --test /etc/cron.daily,这次我的文件出现了!

1
是的,这为我解决了。它不喜欢文件名中的点,将我的文件从myscript.sh重命名为myscript对我有用。
马特·帕金斯

3
这需要更高。我将脚本保存为传统的“ backup.sh”。删除“ .sh”部分即可解决。万分感谢!
大卫

谢谢!决定从日常cron中隐式删除.sh文件的家伙/女孩应该感到羞耻!
西尔万2014年

应该公开鞭打!;-)我不知道人们由于这个决定而集体损失了多少时间...我也想知道这样做是否有充分的理由?
xastor

3

可能是以下几件事之一:

根路径:

根据正在运行的命令,您可能需要通过在root用户的crontab文件顶部放置以下行来扩展root用户的PATH变量:

路径= / usr / sbin:/ usr / bin:/ sbin:/ bin

src:https//help.ubuntu.com/community/CronHowto

或者只是使用脚本中每个命令的完整路径:/bin/ls而不是ls例如。(which ls在命令行中输入路径)。

关于此处报告的文件名中的点,有一个奇怪的错误。可能会扩展到您链接到的文件,尽管这似乎不太可能。

您要保存备份文件的输出吗?在第一行放置这样的内容,以帮助确定它是否根本没有运行或正在运行但在某个时候失败了。

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

或者,尝试将脚本直接添加到crontab文件中:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

如果机器打开,它将每天在15:30运行。在测试运行时每分钟运行一次,直到运行为止,请使用* * * * *。


1
不建议在脚本中使用绝对路径。如果您不知道什么是PATH,请在脚本中自行设置。见原因crontab中不起作用
geirha

有用的链接,谢谢。不使用完整路径的原因是可移植性。很公平。另一个合理的解决方案是在脚本开头定义您正在使用的命令以及其他配置:LS = / bin / ls; SRC_DIR = / home / joe / src。然后使用$ LS $ SRC_DIR。将定义的所有内容放在顶部并放在一个位置。
肖恩2012年

我发现这样做会降低可读性,并且您必须遍历每个COMMAND = / path / to / command来运行的每个新系统。在一个系统上,您需要的所有命令都可以在/ usr / bin中,在另一个系统上,一些命令在/ bin中,其他则在/ usr / bin中。仅将/ usr / bin和/ bin都放在PATH中就不会产生问题。附带说明一下,变量名称应为小写,否则您可能会覆盖特殊的Shell变量或环境变量。
盖尔哈2012年

re:大写变量名。由于我看到的第一个脚本,我一直没有过多地思考。但是您是对的,没有上升空间,也没有下降空间。感谢您指出这一点,现在就打破这种习惯。
肖恩

1

Grep您的系统日志以获取类似消息;

crond: (*system*) BAD FILE MODE

需要将文件限制为(足够)为644):

chmod 0644 /etc/cron.d/my_crontab
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.