通过脚本查找并更新 cron 条目

通过脚本查找并更新 cron 条目

我正在尝试将一段代码添加到我的脚本中,该代码将更新其在 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 更干净,如本线程中所建议的。

相关内容