crontab 工作排程

linux 中经常会有一些定期定时的任务,如周期性的清理一下 /tmp ,周期性的去备份一次数据库,周期性的分析日志等等。

但通常来说,执行这些命令的时间有时会比较尴尬,而就反复性的调用这些重复性的命令,也会造成时间的不必要的浪费。

crontab 简介

crontab 主要用于设置周期性被执行指令,其通过读取指定到crontab 文件中,供之后的读取与执行。

crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。

通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

  1. # Example of job definition:
  2. # .---------------- minute (0 - 59)
  3. # | .------------- hour (0 - 23)
  4. # | | .---------- day of month (1 - 31)
  5. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  6. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  7. # | | | | |
  8. # * * * * * user-name command to be executed

crontab 准备

安装rsyslog,以便我们可以通过日志中的信息来了解我们的任务是否真正的被执行。

  1. sudo apt-get install -y rsyslog
  2. sudo service rsyslog start

在后台启动cron。

  1. sudo cron f &

crontab 使用

image.png

$ crontab -e 表示为当前用户添加计划任务
$ sudo crontab -e 表示为root用户添加计划任务

输入指令选择相应编辑器进入crontab 之后,便可以进行编辑了。
image.png

如果是第一次使用crontab,开始的 # 内容全部是cron 中的相关注释信息。

我们可以在文件的最后一行加入:

*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)

保存成功后会得到最后一排 installing new crontab 的一个提示。

也可以查看crontab 中的命令:
image.png

查看任务是否执行

ps aux | grep cron

or

pgrep cron

image.png

接着,可以查看当前目录下的文件:
image.png
每隔1min,就会创建一个文件。

我们还可以通过tail 监视syslog 中的内容:
image.png

删除任务

crontab -r

image.png

crontab 深入

每个用户使用 crontab -e 添加计划任务,都会在 /var/spool/cron/crontabs 中添加一个该用户自己的任务文档,这样目的是为了隔离。
image.png

cron 服务监测时间最小单位是分钟,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron/crontabs 里面的內容。

在 /etc 目录下,cron 相关的目录有下面几个:
image.png
image.png

后台执行

nohup commands & ,便可以使相应命令在后台执行。