如何编写一个每天午夜运行脚本的cron?

Mat*_*iby 131 ubuntu cron

我听说过crontab是一个不错的选择,但是如何编写该行以及我将它放在服务器上的哪个位置?

Jor*_*ing 248

这是一个关于crontab是什么以及如何在Ubuntu上使用它的好教程.你的crontab行看起来像这样:

00 00 * * * ruby path/to/your/script.rb
Run Code Online (Sandbox Code Playgroud)

(00 00表示午夜 - 0分0小时 - *s表示每个月的每一天.)

Syntax: 
  mm hh dd mt wd  command

  mm minute 0-59
  hh hour 0-23
  dd day of month 1-31
  mt month 1-12
  wd day of week 0-7 (Sunday = 0 or 7)
  command: what you want to run
  all numeric values can be replaced by * which means all

  • @LucasCimon在/ etc/crontab`(在Ubuntu上)允许用户列(在命令之前),但是当你运行`crontab -e`时,你正在编辑一个特定于用户的crontab,而不是允许此列.IIRC Ubuntu不鼓励手动退出`/ etc/crontab`,因为它可能被覆盖.请参见此处:http://stackoverflow.com/questions/8475694/how-to-specify-in-crontab-by-what-user-to-run-script (3认同)
  • 您不想错过“以用户身份运行”栏吗? (2认同)

Rus*_*aue 39

从手册页

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...
Run Code Online (Sandbox Code Playgroud)

值得注意的是可以使用的特殊"昵称"(在手册页中记录),尤其是"@reboot",它没有时间和日期替代方案.

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh
Run Code Online (Sandbox Code Playgroud)

您还可以使用此技巧每分钟多次运行您的cron作业.

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh
Run Code Online (Sandbox Code Playgroud)

要添加cron作业,您可以执行以下三种操作之一:

  1. 将命令添加到用户的crontab,如上所示(并从crontab,第5节,手册页).

    • 用root编辑用户的crontab crontab -e -u <username>
    • 或者用just编辑当前用户的crontab crontab -e
    • 您可以使用EDITOR环境变量 设置编辑器
      • env EDITOR=nano crontab -e -u <username>
      • 或者为整个shell会话设置EDITOR的值
        1. export EDITOR=vim
        2. crontab -e
    • 使脚本可执行 chmod a+x <file>


  1. 创建一个脚本/程序作为cron作业,并将其添加到系统的anacron /etc/cron.*ly目录中

    • anacron /etc/cron.*ly目录:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly中
      • /etc/cron.weekly文件
    • 如:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - 使其可执行
    • 另请参阅anacron手册页: man anacron
    • 使脚本可执行 chmod a+x <file>
    • 什么时候这些cron.*ly脚本运行?
      • 对于RHEL/CentOS 5.x,它们被配置为/etc/crontab/etc/anacrontab在设定的时间运行
      • RHEL/CentOS 6.x +和Fedora 17+ Linux系统只定义了这个/etc/anacrontab,并定义了cron.hourly/etc/cron.d/0hourly


  1. 或者,可以创建系统crontables /etc/cron.d.

    • 先前描述的crontab语法(另外提供用户执行每个作业)被放入文件中,文件被放入/etc/cron.d目录中.
    • 这些在系统包装(例如RPM包)中易于管理,因此通常可能是特定于应用的.
    • 语法差异是必须在时间/日期字段之后和执行命令之前为cron作业指定用户.
    • 添加的文件/etc/cron.d不需要是可执行的.
    • 这是一个以用户身份执行的示例作业someuser,并/bin/bash强制使用shell作为shell.


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php
Run Code Online (Sandbox Code Playgroud)


dyl*_*ini 6

设置 cron 作业的快速指南

创建一个新的文本文件,例如:mycronjobs.txt

对于每个日常作业(00:00、03:45),将计划行保存在mycronjobs.txt中

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh
Run Code Online (Sandbox Code Playgroud)

将作业发送到 cron (每次运行此命令时,cron 都会删除已存储的内容并使用mycronjobs.txt中的新信息进行更新)

crontab mycronjobs.txt
Run Code Online (Sandbox Code Playgroud)

额外有用的信息

查看当前的 cron 作业

crontab -l
Run Code Online (Sandbox Code Playgroud)

删除所有 cron 作业

crontab -r
Run Code Online (Sandbox Code Playgroud)


小智 5

有时您需要使用crontab和rvm指定PATH和GEM_PATH.

像这样:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb
Run Code Online (Sandbox Code Playgroud)