如何使用bash脚本向crontab添加定时任务?

11
我尝试了下面的命令后,crontab 就停止运行了任何作业: echo "@reboot /bin/echo 'test' > /home/user/test.sh"| crontab - 在Linux中编写将任务添加到crontab的正确方法是什么?

你覆盖了你的 crontab,需要使用 crontab -l > /tmp/my.cron 命令拉取现有条目,然后使用 echo "@reboot /bin/echo 'test' > /home/user/test.sh" >> /tmp/my.cron 命令将新的 cron 追加到该文件中,最后使用 crontab < /tmp/my.cron 命令重新读取文件到 crontab 中。 - alvits
1
或者,如果您更喜欢一行代码,可以使用以下命令:(crontab -l; echo "@reboot /bin/echo 'test' > /home/user/test.sh") | crontab - - alvits
1
这个回答解决了你的问题吗?如何使用Bash自动创建cron job而不需要交互式编辑器? - wesinat0r
3个回答

16

我建议你阅读Cron和Crontab的使用和示例

然后你可以运行这个:

➜ ( printf -- '0 4 8-14 * *  test $(date +\%u) -eq 7 && echo "2nd Sunday"' ) | crontab
➜  crontab -l
0 4 8-14 * *  test $(date +\0) -eq 7 && echo "2nd Sunday"            
#!/bin/bash
cronjob="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$cronjob" ) | crontab -u userhere -

希望这可以帮到你。


尝试了这种方法,但返回了“新的crontab文件在EOF之前缺少换行符,无法安装。” - Greg
crontab: usage error: file name must be specified for replace - Pedro Lobito
@Greg,你出现了错误,因为在第一个命令的结尾处没有像作者在第二个示例中那样添加-,这意味着从管道中获取输入。 - papo
@Pedro 正确来说,配置文件的末尾应该始终有一个新行。有时候这并不重要。printf 命令并不会自动添加新行符,我不知道为什么要使用 printf 而不是 echo。将 printf -- 替换成 echo 即可,它会自动添加新行符。 - papo
3
这是唯一正确的脚本添加新工作的方法(不使用crontab -e)。可惜@McGrady没有添加一些说明。文件中没有记录crontab二进制文件可以从管道中获取文本。第一个命令:“执行此操作以为当前用户创建新表,同时删除现有作业。” 第二个命令:“如果需要指定与当前用户不同的用户,请使用-u <user>。要添加到现有作业,请通过crontab -l列出当前作业,然后添加新作业并将其全部导入crontab”。不需要bash,#!/bin/sh就足够了。还请注意我的先前评论。 - papo

0
晚回答,但在CentOS上,我使用一个bash脚本创建一个新的cronjob(对于root用户,根据需要更改用户):
echo "@reboot command..." >> /var/spool/cron/root

>> 会强制将内容追加到现有的 cron 作业中,如果不存在,则创建一个新的 cron 文件并将其追加到其中。


0

我不确定这个是否正确,但可以试一下:

echo "* * * * * whatever" > /etc/crontabs/root

然后检查 "crontab -e",你会在那里看到你的命令。

对于使用alpine发行版的人,请不要忘记调用 "crond" 来启动你的定时任务。


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