cron.daily 中的 anacron 脚本通过符号链接无法运行

4
我该怎么做才能让这个脚本每天都运行?
如果我手动运行脚本,它是可以正常工作的。我可以看到它已经完成了它应该做的事情(备份文件)。但是,它无法作为cron.daily脚本运行。我已经让它连续几天不去管它,但它从来没有运行过。
实际的脚本在这里:/var/www/myapp/backup.sh
这里有一个符号链接:/etc/cron.daily/myapp_backup.sh -> /var/www/myapp/backup.sh
/var/log/cron中的cron日志显示anacron正在运行此脚本:
Aug 19 03:09:01 ip-123-456-78-90 anacron[31537]: Job `cron.daily' started
Aug 19 03:09:01 ip-123-456-78-90 run-parts(/etc/cron.daily)[31545]: starting myapp_backup.sh
Aug 19 03:09:01 ip-123-456-78-90 run-parts(/etc/cron.daily)[31559]: finished myapp_backup.sh

然而,没有证据表明该脚本实际上做了任何事情。

以下是这些文件的安全信息:

ls -la /var/cron.daily

<snip>
lrwxrwxrwx  1 root root   25 Aug 12 21:18 myapp_backup.sh -> /var/www/myapp/backup.sh
</snip>

ls -la /var/www/myapp

<snip>
drwxr-xr-x  2 root root 4096 Aug 13 13:55 .
drwxr-xr-x 10 root root 4096 Jul 12 01:00 ..
-rwxr-xr-x  1 root root  407 Aug 12 23:37 backup.sh
-rw-r--r--  1 root root   33 Aug 12 21:13 list.txt
</snip>

备份脚本使用名为 list.txt 的文件。

该脚本只运行 tar 命令来创建一个归档文件。


最有可能的是“程序路径”问题。最确定的解决方案是在脚本中硬编码所有命令的路径。如果你这样做并且它能够正常工作,那么你就知道问题所在,并且更容易得到修复建议。祝好运。 - shellter
你能展示一下 backup.sh 的内容吗?从 cron.daily 运行符号链接应该可以正常工作。 - lurker
@010110110101 - 你可以检查SELinux是否启用并可能阻止作业运行 - 使用“sestatus”并查看它是否强制执行。此外,检查/var/log/audit以获取潜在线索。 - Emo Mosley
我注意到一些anacron/cron的版本(特别是在debian上)不喜欢扩展名(比如.sh),并且对文件名非常挑剔。也许这不是你的问题,因为你的输出显示anacron已经启动了作业,但这可能会帮助未来的某个人。查看这个答案获取更多信息。 - Daniel Kinsman
你的脚本第一行是以 #!/bin/bash 开始的吗? - nicky_zs
2个回答

11

来自Debian/Ubuntu系统的cron手册页面:

这些目录下的文件需要通过以下一些合理性检查,包括:必须可执行、归属于root用户、不能由组或其他用户进行写入,并且如果是符号链接,则必须指向归属于root用户的文件。此外,文件名必须符合run-parts的文件名要求:完全由字母、数字和特殊字符下划线(“_”)和连字符(“-”)组成。任何不符合这些要求的文件都不会被run-parts执行。例如,任何包含点的文件将被忽略。

因此:

  • 文件需要归属于root用户
  • 如果是符号链接,源文件需要归属于root用户
  • 如果是符号链接,链接名称不应包含点

1
解决了!您可以通过运行以下命令来测试您的脚本是否能够通过cron(例如每天)执行:#run-parts -v --report /etc/cron.daily - Cole

1

我曾经遇到过类似的情况,与cron.hourly和awstats处理有关。

我认为这与SELinux以及anacron没有与cron相同的权限有关。 至今我还没有找到确切的解决方案。

我的临时解决方案是:通过root的cron条目(crontab -e)运行作业,并将其每小时安排一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接