我有一个计划脚本,每小时执行一次 Subversion 存储库的 svnsync 备份。我从根 crontab 中的条目运行它,没有任何问题,但为了获得额外的可见性,我决定从 /etc/cron.hourly 运行它(并且因为我们的一位工程师意外删除了 crontab,因为他认为“crontab -r”的意思是“读取 crontab ;-))
cron.hourly 脚本中的 svnsync 命令全部失败,并显示一条消息,提示需要接受 SVN 存储库的 SSL 证书(这是用户第一次访问 SVN 存储库时以交互方式收到的消息,但是一旦我接受了证书,该消息就不会再出现)。
因此,在我看来,从 cron.hourly 运行脚本时,与通过 root crontab 运行脚本时,脚本在不同的用戶環境下執行。有人能解釋一下其中的差異嗎?
更新:我应该提到我的发行版,我在 CentOS 5.1 上使用 anacron。
更新 2:感谢您迄今为止提出的建议;我认为这更像是一个 Subversion 问题。我总是尝试将我的环境封装到我的脚本中,但这里的问题是,我不确定环境中的什么(或缺少什么)导致 SVN 在我从 cron.hourly 运行脚本时要求接受 SSL 证书。我猜这与 run-parts 脚本的执行方式有关。
答案1
您想使用“--config-dir”选项让它知道在哪里找到已接受的证书(例如默认情况下为~/.subversion)。
话虽如此,我几乎可以肯定你最好从 hooks/post-commit 脚本中调用 svnsync,因为在其他地方建议。那么你的镜像将始终保持同步,而不是与你的主服务器一小时前的位置同步。
答案2
在 Debian/Ubuntu 系统上,cron.daily|weekly|montly 从主 crontab 启动。
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
还请记住,你可能可以将 crontab 片段放在 /etc/cron.d/ 中
如您所见,此环境没有什么特别之处。至少在 Debian/Ubuntu 上,它都是以 root 帐户运行的。
当我在脚本的最开始编写 cron 脚本时,我总是设置我的 PATH 和我将要使用的其他环境变量,因此我可以确定它在任何环境中都能正常工作。
答案3
常规系统范围的 crontab 是特定用户的 crontab,它具有用户名字段,如 所用/etc/crontab
。
使用脚本/etc/cron.*
(每小时、每天、每周、每月)是为root
用户配置 crontab 的一种更简洁、更简单的方法(可避免常见的语法错误),这由在目录中运行脚本或程序来处理run-parts
。默认情况下,所有这些规则仍然在系统范围的 crontab 中定义(/etc/crontab
),因此它们是相同的。
当 cron 作业由 处理时run-parts
,更容易调试,因为您可以通过以下方式简单地测试哪些脚本将准确运行(无需运行它们):
sudo run-parts --report --test /etc/cron.daily
答案4
在我的 RHEL 5.1 系统上,PATH 环境变量是从 /etc/crontab 设置的。顶部的所有内容都是输入到环境中的内容。
如果您重新启动 cron,则第一次运行时(如果来自/etc/crontab
或/var/spool/cron/$USER
)它会在 /var/log/cron 中记录它。否则它只会记录 cron.hourly 已运行
我的 crontab 设置如下:
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
您可以将以下内容放入 /etc/cron.hourly:
env > /tmp/cron.env
然后在文件出现时检查它,并修改脚本(如果可以)以正确设置环境,或者编写 crontab 将调用的简短包装脚本。