如何通过脚本创建 crontab

2024-10-28 08:37:00
admin
原创
50
摘要:问题描述:我需要通过运行脚本来添加 cron 作业以设置服务器。我目前正在使用 Ubuntu。我可以使用,crontab -e但这会打开编辑器来编辑当前的 crontab。我想以编程方式执行此操作。可以这样做吗?解决方案 1:这是一个不使用/要求新作业位于文件中的单行代码:(crontab -l 2>/...

问题描述:

我需要通过运行脚本来添加 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"

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用