我正在尝试将一段代码添加到我的脚本中,该代码将更新其在 crontab 中的条目。到目前为止,我一直在进行以下工作:
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
目标是在多个脚本上运行它,所有脚本都会根据 $VAR 找到并更新自己的行。
例如:
脚本1
#!/bin/bash
VAR="home1"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
脚本2
#!/bin/bash
VAR="home2"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
我想要添加的是让这些脚本创建以下 crontab:
0 */2 * * * /root/home1/script > /dev/null 2>&1
0 */2 * * * /root/home2/script > /dev/null 2>&1
由于某种原因,最后一次运行会覆盖所有条目。
有小费吗?谢谢你!
答案1
使用文件或标准输入来配置 crontab 会新创建(覆盖)内容,而不是附加到可能已存在的内容。
一种简单的解决方案是将每个条目写入一个文件:
crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
{ crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
>> cron-entry-file
然后,在收集完所有条目后,只需执行一次此操作:
crontab -u root cron-entry-file
如果您在不同的脚本和/或不同的时间生成条目,那么每次您都需要执行以下操作:crontab -l > cron-entry-file
保留当前设置,然后按照上述步骤操作。 (希望有人能提出一个更优雅的解决方案,但这种蛮力方法应该可行。)
编辑
由于您的场景并不像我最初编写上述内容时想象的那么简单,请考虑直接操作 crontab 文件。它只是一个常规文件(例如在 /var/cron/tabs/{username} 下)。可能想先读一下:https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually
答案2
我发现让脚本更新 cron 条目的最佳方法是将它们定向到一个单独的文件,并让 cron 从中获取信息。根据我在问题中提供的示例,我最终执行了以下操作:
echo "0 */2 * * * root /root/$VAR/script > /dev/null 2>&1" > /etc/cron.d/$VAR
这将创建以 /etc/cron.d/ 上的变量命名的文件,并将遵循文件本身定义的计划。比管理 crontab 更干净,如本线程中所建议的。