如何通过脚本创建 crontab
- 2024-10-28 08:37:00
- admin 原创
- 49
问题描述:
我需要通过运行脚本来添加 cron 作业以设置服务器。我目前正在使用 Ubuntu。我可以使用,crontab -e
但这会打开编辑器来编辑当前的 crontab。我想以编程方式执行此操作。
可以这样做吗?
解决方案 1:
这是一个不使用/要求新作业位于文件中的单行代码:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
这很重要,这样如果当前没有 crontab 条目,2>/dev/null
您就不会收到某些 *nixes 产生的消息。no crontab for username
解决方案 2:
对于用户 crontabs(包括 root),你可以执行以下操作:
crontab -l -u user | cat - filename | crontab -u user -
sed
其中名为“filename”的文件包含要附加的项目。您还可以使用或其他工具代替进行文本操作cat
。您应该使用crontab
命令,而不是直接修改文件。
类似的操作是:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
如果您正在修改或创建系统 crontab,则可以像操作普通文本文件一样操作它们。它们存储在/etc/cron.d
、/etc/cron.hourly
、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
目录以及文件/etc/crontab
和中/etc/anacrontab
。
解决方案 3:
/etc/cron.d
在 Ubuntu 和许多其他发行版中,您只需将包含一行有效crontab条目的文件放入目录中即可。无需向现有文件添加一行。
如果您只是需要每天运行某些东西,只需将文件放入/etc/cron.daily
。同样,您也可以将文件放入/etc/cron.hourly
、/etc/cron.monthly
和/etc/cron.weekly
。
解决方案 4:
Joe Casadonte 的一行程序非常完美,但如果你使用 运行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 -
解决方案 5:
Crontab 文件只是文本文件,因此可以像任何其他文本文件一样处理。此crontab
命令的目的是使编辑 crontab 文件更加安全。通过此命令编辑时,将检查文件是否有错误,并且只有在没有错误时才会保存。
crontab [path to file]
可用于指定存储在文件中的 crontab。例如crontab -e
,这只会在文件无错误的情况下安装该文件。
因此,脚本可以直接写入 cron tab 文件,也可以将其写入临时文件并使用crontab [path to temp file]
命令加载。直接写入可以省去写入临时文件的麻烦,但也避免了安全检查。
解决方案 6:
对你的问题更简单的回答是:
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/
。在这里您可以找到所有用户的文件。您只需将您的 cronjob 条目附加到相应用户的文件中。在上面的示例中,root 用户的 crontab 文件将附加一个 cronjob,每天凌晨 1 点crontab
运行。/root/test.sh
解决方案 7:
Cron 任务通常存储在每个用户的文件中/var/spool/cron
对您来说,最简单的事情可能就是创建一个配置了作业的文本文件,然后将其复制到 cron spool 文件夹并确保它具有正确的权限(600)。
解决方案 8:
对于那些建议的人,我得更正一下crontab -l | crontab -
:这并非在每个系统上都有效。例如,我不得不在数十台运行旧版 SUSE 的服务器上向根 crontab 添加一项作业(不要问为什么)。旧版 SUSE 会在 的输出前添加注释行crontab -l
,使其crontab -l | crontab -
不具有幂等性(Debian 在 crontab 手册页中认识到了这个问题,并修补了其 Vixie Cron 版本以更改 的默认行为crontab -l
)。
要在添加注释的系统上以编程方式编辑 crontabs crontab -l
,您可以尝试以下操作:
EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
告诉 crontab 使用cat
编辑器(不是通常的默认 vi),它不会更改文件,而是将其复制到 stdout。如果crontab -
期望输入的格式与crontab -e
输出的格式不同,这仍然可能失败。不要尝试用 替换最后crontab -
一个crontab -e
- 它不会起作用。
解决方案 9:
嗯,/etc/crontab
只是一个 ascii 文件,所以最简单的就是
echo "*/15 * * * * root date" >> /etc/crontab
这将添加一个任务,该任务将每 15 分钟向您发送电子邮件。请根据个人喜好进行调整,并通过grep
或其他方式测试此行是否已添加,以使您的脚本具有幂等性。
在 Ubuntu 等系统中,您还可以放入/etc/cron.*
更容易操作和测试的文件---另外,您不必弄乱(系统)配置文件,例如/etc/crontab
。
解决方案 10:
这里介绍了如何在不直接编辑 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 所要求的,但为什么不把所有的解决方案放在一个地方呢?
解决方案 11:
这是一种逐步添加 cron 作业的方法:
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
解决方案 12:
另一种解决方案是一次向 crontab 添加多个脚本:
cat <<EOF | crontab -
* * * * * /bin/foo.sh
* * * * * /bin/gaga.sh
EOF
解决方案 13:
这会将列出的 cron 作业插入my-cron-jobs.txt
到 crontab 中,同时避免创建重复的条目:
( (crontab -l 2>/dev/null || true; cat my-cron-jobs.txt) | sort -u) | crontab -
更具体地说,sort -u
对 crontab 中的所有条目进行排序并删除任何重复的行(包括重复的空行)。
因此,这会产生(可能是不想要的/想要的)副作用,即删除 crontab 中任何已经存在的重复行,并对条目进行排序。
它以Faria、Joe Casadonte之前的回答以及来自 Unix & Linux Stack exchange 的这个回答为基础。
解决方案 14:
我用 python 编写了一个 crontab 部署工具:https ://github.com/monklof/deploycron
pip install deploycron
安装你的 crontab 非常容易,这会将 crontab 合并到系统现有的 crontab 中。
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
解决方案 15:
最简单的解决方案是使用 echo 和 >>,然后运行 crontab 文件名,例如:
ssh $HOST "echo \"* * * * * echo hello >> /var/spool/cron/crontabs/root\"; sleep 2; crontab /var/spool/cron/crontabs/root"
解决方案 16:
我发现使用echo "" | crontab -u root -
可以创建一个空白的 crontab 文件,而无需直接修改文件。然后,您可以使用以下示例轻松添加作业:
line="*/15 * * * * /local/bin/cron.sh > /var/log/cron.log 2>&1"
(crontab -u root -l; echo "$line" ) | crontab -u root -
解决方案 17:
简单地crontab -l < "your-file-path"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件