我需要通过运行脚本来添加一个cron job以设置服务器。我目前正在使用Ubuntu操作系统。我可以使用crontab -e
,但那会打开一个编辑器来编辑当前的cron表。我想以编程方式完成这个任务。
这种做法可行吗?
这里有一个一行代码的方法,不需要/要求新工作在文件中:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
很重要,因为它可以避免一些 *nix 系统在没有 crontab 记录时输出 no crontab for username
信息。
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
希望这能帮助到某些人。 - Danny对于用户的定时任务(包括 root 用户),您可以执行以下操作:
crontab -l -u user | cat - filename | crontab -u user -
有一个名为“filename”的文件,其中包含要追加的项目。您也可以使用sed
或其他工具进行文本操作,而不是使用cat
。 您应该使用crontab
命令而不是直接修改文件。
类似的操作如下:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
如果您正在修改或创建系统定时任务,那么这些任务可以像普通文本文件一样进行操作。它们存储在/etc/cron.d
、/etc/cron.hourly
、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
目录和文件/etc/crontab
和/etc/anacrontab
中。
echo
),我得到了“crontab: usage error: file name must be specified for replace.”的错误。Cron man页面显示语法为crontab [ -u user ] file
,即必须指定文件名。有什么诀窍可以让它接受管道数据吗? - Mark Berry在Ubuntu及许多其他发行版中,您可以将一个文件放入/etc/cron.d
目录中,其中包含一个带有有效crontab条目的单行。不需要向现有文件添加一行。
如果您只需要每天运行某个东西,只需将文件放入/etc/cron.daily
中即可。同样,您还可以将文件放入/etc/cron.hourly
、/etc/cron.monthly
和/etc/cron.weekly
中。
Joe Casadonte的一行代码非常完美,但是如果你使用set -e
运行,也就是说,如果你的脚本设置为在出现错误时失败,并且还没有cronjobs,那么这个一行代码将不会创建cronjob,但也不会停止脚本。这种无声的失败可能会非常误导人。
原因是crontab -l
返回一个1
返回码,导致后续命令(echo
)不被执行...因此cronjob未被创建。但由于它们作为子进程执行(因为括号),它们不会停止脚本。
(有趣的是,如果你再次运行相同的命令,它将起作用:一旦你执行了crontab -
一次,crontab -l
仍然不输出任何内容,但它不再返回错误(你不再收到no crontab for <user>
消息)。因此,后续的echo
被执行,cronjob被创建)
set -e
,那么这行代码必须是:(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
Crontab文件只是文本文件,可以像处理其他文本文件一样处理。 crontab
命令的目的是使编辑crontab文件更加安全。 通过该命令编辑时,系统会检查文件是否存在错误,如果没有错误,则保存。
crontab [文件路径]
可以用于指定存储在文件中的crontab。与crontab -e
类似,只有文件没有错误时才会安装。
因此,脚本可以直接编写cron tab文件,或将其写入临时文件并使用crontab [临时文件路径]
命令加载。 直接编写可避免编写临时文件,但也避免了安全检查。
crontab [文件路径]
.. 这绝对是最好的选择,因为它允许更易读的代码。我使用 crontab 跟踪包裹并根据状态更改桌面壁纸。当我不期望包裹时,它不需要每小时都检查。这就是为什么我希望脚本可以自动编辑 cron 频率的原因。 - Rasmuscrontab [文件路径]
不一定需要一个“临时”文件,它可以加载任何按照 crontab 布局正确格式化的文件。这是我们在 SlickStack 中使用的方法,因此 crontab 模板可以随时更新(下载)并重新安装:https://github.com/littlebizzy/slickstack/blob/master/00-crontab.txt - Jesse Nickles给你一个更简单的答案:
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
您可以按以下方式在远程服务器上设置cron作业:
#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
do
echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done
在Linux中,crontab
文件的默认位置是/var/spool/cron/
。在这里,您可以找到所有用户的crontab
文件。您只需要将您的cron作业条目附加到相应用户的文件中即可。在上面的示例中,root用户的crontab文件正在添加一个cron作业以在每天凌晨1点运行/root/test.sh
。/var/spool/cron/crontabs/root
。 - Íhor Mé常见的定时任务通常存储在每个用户文件中,位于/var/spool/cron
最简单的方法可能是创建一个配置好的文本文件,然后将其复制到cron spool文件夹并确保它具有正确的权限(600)。
好的,/etc/crontab
只是一个ASCII文件,因此最简单的方法就是:
echo "*/15 * * * * root date" >> /etc/crontab
这将添加一个工作,每15分钟给您发送电子邮件。根据需要进行调整,并通过grep
或其他方式进行测试,以确定该行是否已添加,使您的脚本具有幂等性。
在Ubuntu等操作系统中,您还可以将文件放入/etc/cron.*
中,这样更易于进行测试,而且不会干扰(系统)配置文件,如/etc/crontab
。
这是一种逐步添加cron作业的方法:
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"