我如何以编程方式创建一个新的 cron 作业?

2024-10-18 09:00:00
admin
原创
77
摘要:问题描述:我希望能够以编程方式添加一个新的 cron 作业,最好的方法是什么?根据我的研究,我似乎可以转储当前的 crontab,然后添加一个新的 crontab,并将其传送回 crontab:(crontab -l ; echo "0 * * * * wget -O - -q http:/...

问题描述:

我希望能够以编程方式添加一个新的 cron 作业,最好的方法是什么?

根据我的研究,我似乎可以转储当前的 crontab,然后添加一个新的 crontab,并将其传送回 crontab:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

有没有更好的方法?


解决方案 1:

如果你以 root 身份运行,最好的方法是将文件放入 /etc/cron.d

如果你使用包管理器来打包你的软件,那么你可以简单地将文件放在该目录中,这些文件将被解释为 crontab,但会为用户名添加一个额外的字段,例如:

文件名:/etc/cron.d/per_minute

内容:
* * * * * root /bin/sh /home/root/script.sh

解决方案 2:

OP 的解决方案有一个错误,它可能允许添加两次条目,请使用下面的方法修复。

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

解决方案 3:

向 cron 添加一些内容

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

从 cron 中删除此项

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

希望可以帮助别人

解决方案 4:

此处的大多数解决方案都是向 crontab 添加行。如果您需要更多控制,则希望能够控制 crontab 的全部内容。

您可以使用管道来非常优雅地完成此操作。

要完全重写 crontab,请执行以下操作

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

这应该很容易与这里描述的其他答案结合起来,例如

crontab -l | <something> | tee |crontab -

或者,如果你的内容在文件中,那就更简单了

cat <file> |crontab -

解决方案 5:

如果你打算在只运行一次的场景中执行此操作以获取某些内容,请查看“at”

解决方案 6:

假设您的 crontab 中已经有一个条目,则以下命令应该可以正常工作。请注意,变量$CMD只是为了提高可读性。在过滤重复项之前进行排序很重要,因为uniq只对相邻的行起作用。

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

如果您当前有一个空的 crontab,您将收到以下错误到 st​​derr:

no crontab for user

如果您想避免这种情况,您可以增加一点复杂性,执行以下操作:

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

解决方案 7:

只需将编辑器更改为 tee 命令:

export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e

解决方案 8:

这是另一种避免重复的单行方法

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

这是一种执行 JohnZ 的回答并避免no crontab for user消息的方法,或者如果您需要在set -eu类型环境中操作并且不能让任何东西返回失败(在这种情况下该2>/dev/null部分是可选的):

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

或者如果你想要将事情分开,以便它们更具可读性:

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

或者可选地删除对 your_command 的任何引用(例如:如果计划已更改,您只希望它被 cron 一次)。在这种情况下,我们不再需要uniq(额外的好处是,插入顺序也会保留):

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

解决方案 9:

man crontab 也很有用:

计划任务(1)

姓名

   crontab - manipulate per-user crontabs (Dillon's Cron)

概要

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user

解决方案 10:

function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`
'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

解决方案 11:

除了 JohnZ 的回答之外,如果您是 sudoer,则以下是作为 root 进行安排的语法:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

解决方案 12:

这将检查以确保您的命令在添加之前不存在。

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

干杯。

解决方案 13:

更好的方法是使用 Ansible playbook 执行以下任务:

---
- name: Deploy cron
  hosts: all
  gather_facts: false
  tasks:
    - name: Update Cron job
      ansible.builtin.cron:
        name: Run Drupal Cron Job
        user: www-data
        minute: "0"
        job: "/var/www/html/drupal/vendor/bin/drush core:cron"

上述解决方案使用drush core:cron,因为最近的 Drupal 的 cron 调用需要密钥(必须提取然后进行硬编码)。

参见:使用 cron 命令配置 cron 作业。

然后使用ansible-playbook -i hosts deploy.yml运行它,其中hosts文件是:

echo "[all]
92.168.0.123   ansible_connection=ssh    ansible_user=root" > hosts

192.168.0.123您要部署的主机在哪里。

您可以将其用作部署脚本的一部分,或将其放入Jenkinsfile部署管道中。

解决方案 14:

您还可以将任务添加到 /etc/cron。*/

解决方案 15:

在 macOS 上,将 stdout 管道传输到其中crontab并没有为我安装新的 crontab,因此我找到了这个解决方案,使用tee子 shell 中的编辑器:

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

解决方案 16:

如果您希望以用户身份运行任务:

crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | crontab -

如果您希望任务以权限运行:

sudo crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | sudo crontab -

并检查任务(带或不带‘sudo’):

crontab -l | sed '/^$/d; /#/d'

解决方案 17:

下面是我在脚本中使用的内容

1.

(2>/dev/null crontab -l ; echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -
cat <(crontab -l 2>/dev/null) <(echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -

写出当前的 crontab

crontab -l > mycron 2>/dev/null

echo new cron 到 cron 文件中

echo "0 3 * * * /usr/local/bin/certbot-auto renew" >> mycron

安装新的 cron 文件

crontab mycron

rm mycron

解决方案 18:

为了在将来更改命令时具有灵活性,您可以这样做(使用更新脚本效果最佳)

MARK=SOME_UNIQUE_MARK_TEXT
LINE="This is the command # $MARK"
# NOTE: I'm using -e because I might want to avoid weird bash expansions for '*' or '$' and place:
# x2A instead of *
# x24 instead of $
( crontab -l | grep -v $MARK ; echo -e "0 * * * *" $LINE ) | crontab -

通过这种方式,我可以更新不再适用的旧 crontab 命令。

基本上,我得到了当前的 crontab,我删除了包含 MARK () 的行grep -v,并通过将其附加到 crontab 文件的末尾将其替换为新的行echo -e。在这个特定情况下,我希望它每小时 0 分钟执行一次,如从这里0 * * * *可以看到的那样。

解决方案 19:

我正在添加一个类似于@JohnZ的解决方案,它不会添加重复项,同时仍保留 crontab 的现有顺序。我们有相当多的作业被大量注释,我们需要保留该结构。

$ { \n    crontab -l; \n    echo "*/1  * * * *   echo job one"  &>/dev/null; \n    echo "*/30 * * * *   echo job two"  &>/dev/null; \n  } | awk '(/^#/ || !a[$0]++)' | crontab -

解决方案 20:

您也可以直接编辑 cron 表文本文件,但您的解决方案似乎完全可以接受。

解决方案 21:

它对我来说一直很有效。

您应该考虑一个稍微复杂一点的脚本,它可以做三件事。

  1. 附加 crontab 行;确保它不存在。当它已经存在时添加是不好的。

  2. 删除 crontab 行。如果它不存在,也许只会发出警告。

  3. 结合以上两个功能来替代 crontab 行。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   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源码管理

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

免费试用