如何编写一个cron任务,使其每天在午夜运行一个脚本?

168

我听说 crontab 是不错的选择,但我应该如何编写这行代码并将其放在服务器上的哪里呢?

6个回答

284

这里有一个好的教程介绍了在Ubuntu上使用crontab是什么以及如何使用。你的crontab行应该看起来像这样:

00 00 * * * ruby path/to/your/script.rb

(00 00 表示午夜--0 分钟和 0 小时--而 * 意味着每个月的每一天.)

语法: 
  mm hh dd mt wd  command
mm 分钟 0-59 hh 小时 0-23 dd 月份的第几天 1-31 mt 月份 1-12 wd 周几 0-7 (星期日 = 0 或 7) command: 要运行的命令 所有数字值都可以用 * 替换,表示所有值

2
你不想念“以用户身份运行”这一列吗? - Lucas Cimon
6
在Ubuntu系统中,/etc/crontab文件允许在命令之前添加用户列。但是,当你运行crontab -e命令时,你正在编辑一个特定用户的crontab文件,该文件不允许添加用户列。据我所知,Ubuntu不鼓励手动退出/etc/crontab文件,因为这样可能会被覆盖。详情请参见:https://dev59.com/n2oy5IYBdhLWcg3wieu6 - Jordan Running
@Jordan,对于root用户的crontab的答案是 sudo crotab -u root -e - dashesy

41

来自 man 手册页面

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
   ...

需要注意可以使用的特殊“昵称”(记录在man页面中),特别是“@reboot”,它没有时间和日期替代方案。

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

您也可以使用这个技巧来让您的 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

要添加一个cron任务,你可以选择以下三种方法之一:

  1. 像上面所示(来自crontab第5节man页面)将命令添加到用户的crontab中。

    • 使用crontab -e -u <username>作为root编辑用户的crontab
    • 或者只使用crontab -e编辑当前用户的crontab
    • 您可以使用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页面: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中定义此项,并在/etc/cron.d/0hourly中定义cron.hourly


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

    • 将先前描述的crontab语法(还需要为每个作业提供一个要执行的用户)放入文件中,并将文件放到/etc/cron.d目录中。
    • 这些易于在系统打包中管理(例如RPM软件包),因此通常是面向应用程序的。
    • 语法差异在于必须在时间/日期字段之后且执行命令之前指定要执行该cron作业的用户。
    • 添加到/etc/cron.d中的文件无需可执行。
    • 以下是一个示例作业,作为用户someuser执行,并强制使用/bin/bash作为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

8

快速设置cron任务的指南

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

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

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

将任务发送给cron(每次运行此命令,cron都会删除已存储的信息并更新为mycronjobs.txt中的新信息)。
crontab mycronjobs.txt

额外有用信息

查看当前的定时任务

crontab -l

删除所有定时任务

crontab -r

1
你的03:45的crontab语法不正确。crontab字段是分钟然后小时,即“45 03” - 你在帖子中写反了。 - Russell E Glaue

5
有时候你需要在使用rvm的crontab中指定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

1
您可以通过两种方式执行shell脚本,一种是使用cron作业,另一种是编写一个shell脚本。
假设您的脚本名称为“yourscript.sh”。
首先检查脚本的用户权限。使用以下命令检查脚本的用户权限: ll script.sh 如果脚本在根目录中,则使用以下命令: sudo crontab -e 其次,如果脚本持有用户“ubuntu”,则使用以下命令: crontab -e 在您的crontab中添加以下行: 55 23 * * * /path/to/yourscript.sh 另一种方法是编写一个脚本并在后台运行。这里是一个脚本,您需要将要运行的脚本名称(例如:youscript.sh)放在其中,该脚本将在每天23:55运行: #!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done 将其保存在一个文件中(我们将其命名为“every-day.sh”)。

sleep 1d - 意味着它等待一天然后再次运行。

现在给你的脚本授权。使用以下命令:-

chmod +x every-day.sh

现在,使用"nohup"在后台执行此shell脚本。 即使您从会话注销,它也将继续执行脚本。

使用以下命令执行脚本。

nohup ./every-day.sh &

注意:要在每天23:55运行“yourscript.sh”,必须在23:55准确执行“every-day.sh”脚本。


0
将此句话放入crontab文件中: 0 0 * * * /usr/local/bin/python /opt/ByAccount.py > /var/log/cron.log 2>&1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接