代码之家  ›  专栏  ›  技术社区  ›  Raúl Roa

如何在没有交互式编辑器的情况下使用Bash自动创建cron作业?

  •  531
  • Raúl Roa  · 技术社区  · 17 年前

    crontab 支持在不使用编辑器的情况下创建cron作业( crontab -e )?如果是这样,从Bash脚本创建cron作业的代码是什么?

    22 回复  |  直到 3 年前
        1
  •  633
  •   Jean-Luc Barat    9 年前

    您可以按如下方式添加到crontab:

    #write out current crontab
    crontab -l > mycron
    #echo new cron into cron file
    echo "00 09 * * 1-5 echo hello" >> mycron
    #install new cron file
    crontab mycron
    rm mycron
    

    克朗线解释

    * * * * * "command to be executed"
    - - - - -
    | | | | |
    | | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
    | | | ------- Month (1 - 12)
    | | --------- Day of month (1 - 31)
    | ----------- Hour (0 - 23)
    ------------- Minute (0 - 59)
    

    nixCraft .

        2
  •  355
  •   Thomas Weller    8 年前

    crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
    

    crontab -l cat echo 打印新命令 crontab - crontab-l .

    注意:如果用户没有现有的crontab,您可能会看到以下消息:

    no crontab for <username>
    

        3
  •  102
  •   MoonCactus    8 年前

    这个较短的文件不需要临时文件,它不受多次插入的影响,并且它允许您更改现有条目的计划。

    假设你有这些:

    croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
    cronjob="0 */15 * * * $croncmd"
    

    要将其添加到crontab中,且不重复:

    ( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
    

    要将其从crontab中删除,无论其当前计划如何:

    ( crontab -l | grep -v -F "$croncmd" ) | crontab -
    

    笔记:

    • grep-F按字面意思匹配字符串,因为我们不想将其解释为正则表达式
        4
  •  41
  •   Stoutie    14 年前

    谢谢大家的帮助。将我在这里和其他地方发现的东西拼凑在一起,我得出了这个结论:

    密码

    command="php $INSTALL/indefero/scripts/gitcron.php"
    job="0 0 * * 0 $command"
    cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
    

    我不知道如何在不重复自己的情况下消除对这两个变量的需求。

    command 这显然是我想要安排的命令。 job $command 并添加调度数据。我需要在完成这项工作的代码行中分别使用这两个变量。

    1. <(*command*) crontab -l fgrep 命令。
    2. 匹配字符串 然后过滤掉以下匹配项 $命令 ( -v 选项),不区分大小写( -i
    3. 再一次,小重定向的事情( <(*命令*) cat 命令。
    4. 命令还接收 echo "$job" <(*命令*) ).
    5. crontab-l ,组合在一起,通过管道(“|”)传输到 crontab - 终于要写了。
    6. 从此,他们都过着幸福的生活!

    这行代码过滤掉与命令匹配的任何cron作业,然后用新的cron作业写出剩余的cron任务,有效地起到了“添加”或“更新”函数的作用。 要使用此功能,您只需交换 命令 变量。

        5
  •  28
  •   duckyflip    17 年前

    编辑(固定覆盖):

    cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
    
        6
  •  21
  •   Mike Mackintosh    9 年前

    关于crontab的使用有很多好的答案,但没有提到一种更简单的方法,比如使用 cron .

    使用 定时任务 将利用位于以下位置的系统文件和目录 /etc/crontab , /etc/cron.daily,weekly,hourly /etc/cron.d/

    cat > /etc/cron.d/<job> << EOF
    SHELL=/bin/bash 
    PATH=/sbin:/bin:/usr/sbin:/usr/bin 
    MAILTO=root HOME=/  
    01 * * * * <user> <command>
    EOF
    

    在上述示例中,我们在 /etc/cron.d/ ,提供了命令成功执行的环境变量,并提供了 user 对于命令,以及 command 本身。此文件不应可执行,名称应仅包含字母数字和连字符(更多详细信息见下文)。

    不过,为了给出一个彻底的答案,让我们看看它们之间的区别 crontab cron/crond

    crontab -- maintain tables for driving cron for individual users
    

    对于那些想在系统上的用户上下文中运行作业的人,使用 可能很有道理。

    cron -- daemon to execute scheduled commands
    

    定时任务 .

    http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

        7
  •  9
  •   BradChesney79    7 年前

    sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync
    

    sudo-因为您需要提升权限才能更改/etc目录下的cron配置

    echo-一种在std out上创建输出的工具。printf,猫。..也会奏效

    “-因为我的第一个双引号需要一个伙伴来关闭正在输出的行

    >>-双重定向附加而不是覆盖*

    /etc/cron.d/vmclocksync-vmclocksync是我选择的文件名,它位于/etc/cron.d中/


        8
  •  7
  •   Gibbsoft    12 年前

    为了用BASH脚本快速、整洁地创建/替换crontab,我使用了以下符号:

    crontab <<EOF
    00 09 * * 1-5 echo hello
    EOF
    
        9
  •  7
  •   kvz    7 年前

    很可能你正在自动化这项工作,你不希望一个工作被添加两次。 在这种情况下,使用:

    __cron="1 2 3 4 5 /root/bin/backup.sh"
    cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")
    

    这仅在您使用BASH时有效。我不知道正确的DASH( sh

    更新: 如果用户还没有crontab,这就不起作用。一种更可靠的方法是:

    (crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 
    

    echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup
    

    找到那些 another SO question .

        10
  •  5
  •   Bartłomiej Semańczyk    10 年前
    echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
    
        11
  •  4
  •   user11547308    7 年前

    一种变体,仅在未找到所需字符串时编辑crontab:

    CMD="/sbin/modprobe fcpci"
    JOB="@reboot $CMD"
    TMPC="mycron"
    grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
    
        12
  •  3
  •   chuck    17 年前
    (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 -l > mycron 2>/dev/null
    

    #将新的cron回显到cron文件中

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

    crontab mycron
    
    rm mycron
    
        13
  •  2
  •   gsus    7 年前

    当然,这只适用于根。如果您的系统支持此功能,您应该会在其中看到几个示例。(注意行中包含的用户名,语法与旧的/etc/crontab相同)

    这是cron中一个令人遗憾的错误特性,即无法作为普通用户处理此问题,而且许多cron实现根本无法处理此问题。

        14
  •  2
  •   akash    7 年前

    用于在没有交互式编辑器的情况下添加cron作业的Bash脚本。

    #!/bin/bash
    
    cron_path=/var/spool/cron/crontabs/root
    
    #cron job to run every 10 min.
    echo "*/10 * * * * command to be executed" >> $cron_path
    
    #cron job to run every 1 hour.
    echo "0 */1 * * * command to be executed" >> $cron_path
    
        15
  •  2
  •   Anh Quach    5 年前

    我对此的首选解决方案是:

    (crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
    

        16
  •  1
  •   Klas Mellbourn    9 年前

    crontab

    function addtocrontab () {
      local frequency=$1
      local command=$2
      local job="$frequency $command"
      cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
    }
    addtocrontab "0 0 1 * *" "echo hello"
    
        17
  •  1
  •   speefak    8 年前
    CRON="1 2 3 4 5 /root/bin/backup.sh" 
    cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
    

    在grep-exact命令中添加-w参数,如果不添加-w参,添加cronjob“testing”会导致删除cronjob”testing123“

    cronjob_editor () {         
    # usage: cronjob_editor '<interval>' '<command>' <add|remove>
    
    if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
    if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
    if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi
    
    if [[ "$3" == add ]] ;then
        # add cronjob, no duplication:
        ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
    elif [[ "$3" == remove ]] ;then
        # remove cronjob:
        ( crontab -l | grep -v -F -w "$2" ) | crontab -
    fi 
    } 
    cronjob_editor "$1" "$2" "$3"
    

    测试:

    $ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
    $ crontab  -l
    $ */10 * * * * echo "this is a test" > export_file
    
        18
  •  0
  •   andcoz    17 年前

    不,crontab中没有修改cron文件的选项。

    您必须:获取当前的cron文件(crontab-l>newfile),更改它并将新文件放置到位(crontab newfile)。

    如果你熟悉perl,你可以使用这个模块 Config::Crontab .

        19
  •  0
  •   user8555334 user8555334    8 年前

    cronjob_creator () {         
    # usage: cronjob_creator '<interval>' '<command>'
    
      if [[ -z $1 ]] ;then
        printf " no interval specified\n"
    elif [[ -z $2 ]] ;then
        printf " no command specified\n"
    else
        CRONIN="/tmp/cti_tmp"
        crontab -l | grep -vw "$1 $2" > "$CRONIN"
        echo "$1 $2" >> $CRONIN
        crontab "$CRONIN"
        rm $CRONIN
    fi
    }
    

    测试:

    $ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
    $ crontab  -l
    $ */10 * * * * echo "this is a test" > export_file
    

        20
  •  0
  •   Juno Sprite    4 年前

    假设你以用户“ubuntu”登录,但你想向其他用户的crontab添加一个作业,例如“john”。您可以执行以下操作:

    (sudo crontab -l -u john; echo "* * * * * command") | awk '!x[$0]++' | sudo crontab -u john -
    

    https://www.baeldung.com/linux/create-crontab-script

    其他用户的crontab

        21
  •  -1
  •   Karol Bednarz    5 年前

    COMMAND="/var/lib/postgresql/backup.sh"
    CRON="0 0 * * *"
    USER="postgres"
    CRON_FILE="postgres-backup"
    # At CRON times, the USER will run the COMMAND
    echo "$CRON $USER $COMMAND" | sudo tee /etc/cron.d/$CRON_FILE
    echo "Cron job created. Remove /etc/cron.d/$CRON_FILE to stop it."