您目前的方法有困难,因为crontab -e 不从标准输入读取。但是,没有-e 开关的crontab 确实从标准输入读取。
最明显的方法是将新的 cron 作业附加到现有的 crontab 中:
crontab -l > current_cron
cat >> current_cron << EOF
# new cron job here
EOF
crontab < current_cron
rm -f current_cron
这种方法的明显问题是无法检查 cron 作业是否已经存在。这就是它可能变得有点棘手的地方。
解决这个问题的一种方法是在 crontab 中设置一个“脚本管理部分”,通常位于底部:
# DO NOT MODIFY THE SECTION BELOW MANUALLY. IT'S MANAGED BY AUTOMATION.
#---script managed section---
"cron job 1"
"cron job 2"
然后,脚本可以管理此部分 - 最好有一个脚本来管理所有自动 cron 作业:
crontab -l > current_cron
sed '/---script managed section---/q' current_cron > new_cron
cat >> new_cron << EOF
# updated cron jobs here
EOF
crontab < new_cron
rm -f new_cron current_cron
如果我们需要更细粒度的控制,那么我们可以为每个托管的 cron 作业设置一个部分,带有开始和结束标记,并让脚本每次处理一个特定的部分。
但是,对于 Ubuntu,有一个更好的主意。我们可以完全取消 crontab 并改用 /etc/cron.d。在这里,每个 cron 作业都有一个文件,它遵循 cron 作业规范的确切格式。由于 cron 作业和 /etc/cron.d 文件之间存在 1:1 的对应关系,因此它们直接作为文件进行管理,而不是通过 crontab 命令进行管理,因此自动化更加容易。
来自 Ubuntu 上的man cron:
在 Debian 中,cron 读取 /etc/cron.d 目录中的文件。 cron 以与 /etc/crontab 文件相同的方式处理 /etc/cron.d 中的文件(它们遵循该文件的特殊格式,即它们包含用户字段)。但是,它们独立于 /etc/crontab:例如,它们不会从它继承环境变量设置。此更改特定于 Debian。