我需要通过我运行的脚本添加一个 cron 作业来设置服务器。我目前正在使用 Ubuntu。我可以使用 crontab -e
,但这会打开一个编辑器来编辑当前的 crontab。我想以编程方式执行此操作。
有可能这样做吗?
这是一个不使用/不需要新作业在文件中的单行:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
很重要,因此如果当前没有 crontab 条目,您不会收到某些 *nixes 产生的 no crontab for username
消息。
对于用户 crontabs(包括 root),您可以执行以下操作:
crontab -l -u user | cat - filename | crontab -u user -
其中名为“filename”的文件包含要附加的项目。您还可以使用 sed
或其他工具代替 cat
进行文本处理。您应该使用 crontab
命令而不是直接修改文件。
类似的操作是:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
如果您正在修改或创建系统 crontab,则可能会像处理普通文本文件一样操作这些 crontab。它们存储在 /etc/cron.d
、/etc/cron.hourly
、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
目录以及文件 /etc/crontab
和 /etc/anacrontab
中。
echo
),我得到“crontab:使用错误:必须指定文件名以进行替换。” Cron 手册页将语法显示为 crontab [ -u user ] file
,即带有强制文件名。是否有一些技巧可以让它接受管道数据?
stdin
。我会更正我的答案。
在 Ubuntu 和许多其他发行版中,您只需将文件放入 /etc/cron.d
目录中,其中包含一行和有效的 crontab 条目。无需在现有文件中添加一行。
如果您只需要每天运行一些东西,只需将文件放入 /etc/cron.daily
。同样,您也可以将文件放入 /etc/cron.hourly
、/etc/cron.monthly
和 /etc/cron.weekly
。
Crontab 文件只是文本文件,因此可以像任何其他文本文件一样对待。 crontab
命令的目的是使编辑 crontab 文件更安全。通过此命令编辑文件时,会检查文件是否有错误,只有在没有错误时才保存。
crontab [path to file]
可用于指定存储在文件中的 crontab。与 crontab -e
一样,这只会在没有错误的情况下安装文件。
因此,脚本既可以直接写入 cron 选项卡文件,也可以将它们写入临时文件并使用 crontab [path to temp file]
命令加载它们。直接写省去了写临时文件,但也避免了安全检查。
crontab [path to file]
.. 这绝对是我的最佳选择,因为它允许更清晰的代码。我使用 crontab 来跟踪包裹并使用状态更改我的桌面墙纸。当我不期待包裹时,它不需要每小时检查一次。这就是我希望脚本自动编辑 cron 频率的原因。
crontab [path to file]
不一定需要“临时”文件,它可以加载在 crontab 布局中正确格式化的任何文件。这是我们在 SlickStack 中使用的方法,因此可以随时更新(下载)crontab 模板,然后重新安装:github.com/littlebizzy/slickstack/blob/master/00-crontab.txt
(我没有足够的声誉来发表评论,所以我将其添加为答案:随时将其添加为他的答案旁边的评论)
Joe Casadonte's one-liner 是完美的,除非您使用 set -e
运行,即如果您的脚本设置为出错失败,并且还没有 cronjobs。在这种情况下,单行程序不会创建 cronjob,但不会停止脚本。无声的失败可能非常具有误导性。
原因是 crontab -l
以 1
返回码返回,导致后续命令(echo
)不被执行......因此没有创建 cronjob。但是由于它们是作为子进程执行的(由于括号),它们不会停止脚本。
(有趣的是,如果您再次运行相同的命令,它将起作用:一旦您执行了 crontab -
一次,crontab -l
仍然不输出任何内容,但它不再返回错误(您没有得到 no crontab for <user>
消息)。因此执行后续的 echo
并创建 crontab)
在任何情况下,如果您使用 set -e
运行,该行必须是:
(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
对您的问题更简单的答案是:
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
您可以在远程服务器上设置 cronjobs,如下所示:
#!/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
文件。您只需要将您的 cronjob 条目附加到相应用户的文件中。在上面的示例中,root 用户的 crontab 文件附加了一个 cronjob 以在每天凌晨 1 点运行 /root/test.sh
。
/var/spool/cron/crontabs/root
。
Cron 作业通常存储在 /var/spool/cron
下的每个用户文件中
您要做的最简单的事情可能就是创建一个配置了作业的文本文件,然后将其复制到 cron spool 文件夹并确保它具有正确的权限 (600)。
作为对那些建议 crontab -l | crontab -
的更正:这并不适用于每个系统。例如,我必须在数十台运行旧版本 SUSE 的服务器上的根 crontab 中添加一个作业(不要问为什么)。旧的 SUSE 在 crontab -l
的输出前添加注释行,使 crontab -l | crontab -
非幂等(Debian 在 crontab 联机帮助页中发现了这个问题,并修补了它的 Vixie Cron 版本以更改 crontab -l
的默认行为)。
要在 crontab -l
添加注释的系统上以编程方式编辑 crontab,您可以尝试以下操作:
EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
告诉 crontab 使用 cat
作为编辑器(不是通常的默认 vi),它不会更改文件,而是将其复制到 stdout。如果 crontab -
期望的输入格式与 crontab -e
输出的格式不同,这可能仍然会失败。不要尝试用 crontab -e
替换最后的 crontab -
- 它不起作用。
好吧 /etc/crontab
只是一个 ascii 文件,所以最简单的就是
echo "*/15 * * * * root date" >> /etc/crontab
这将添加一个每 15 分钟向您发送电子邮件的工作。调整口味,并通过 grep
或其他方式测试是否已添加该行以使您的脚本具有幂等性。
在 Ubuntu 等人上,您还可以将文件放在 /etc/cron.*
中,这更容易执行和测试——而且您不会弄乱(系统)配置文件,例如 /etc/crontab
。
crond
确实 监控,而且它肯定在 OP 声明的平台上。
这是一种增量添加 cron 作业的方法:
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
这是在不直接编辑 cron 文件的情况下修改 cron 条目的方法(不赞成)。
crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -
如果要删除 cron 条目,请使用以下命令:
crontab -l -u <user> | sed '/find/d' | crontab -u <user> -
我意识到这不是 gaurav 所要求的,但为什么不将所有解决方案集中在一个地方呢?
我在 python 中编写了一个 crontab 部署工具:https://github.com/monklof/deploycron
pip install deploycron
安装你的 crontab 非常容易,这会将 crontab 合并到系统现有的 crontab 中。
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
一次将多个脚本添加到 crontab 的另一种解决方案:
cat <<EOF | crontab -
* * * * * /bin/foo.sh
* * * * * /bin/gaga.sh
EOF
最简单的解决方案是将 echo 与 >> 一起使用,然后运行 crontab 文件名 ex:
ssh $HOST "echo \"* * * * * echo hello >> /var/spool/cron/crontabs/root\"; sleep 2; crontab /var/spool/cron/crontabs/root"
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
希望这对某人有所帮助*/
在这里是什么意思?