Linux任务调度

万壑松风知客来,摇扇抚琴待留声

1. 简介

Linux 任务调度,这本应该是属于前面《Windows任务调度》的姊妹篇一同更新的,但介于某些原因合并后效果展现不好,所以这里只得分开来介绍。

说实话自从工作后亲身经历,才发现原来大学里面讲的很多知识真的是有用的,每次遇到这样的问题,我都会清晰的记得自己在某课本上对该知识点做了记录,但是不清楚的是如何正确去使用它,例如本文遇见的问题,我亲自回去翻了《Linux配置》这本书,里面密密麻麻的记录了很多知识包括这一点。

之所以写这篇文章有几个原因,1:很多知识其实在平常就会遇到,善于积累,如果多一点重视,以后就会少一点麻烦。2:做学问不只是做记录,得亲自实验过,例如我书本上的记录在实际场景中有缺陷。3:像前面文章一样将知识点记录下来,以后作为参考。

2. crontab

Linux 的 crontab 是用来定期执行程序的命令,在 Linux 中 crond 命令每分钟都会检查是否有需要执行的命令,如果有,便会自动执行调度。

2.1. 语法
1
2
3
crontab [-u user] file

crontab [-u user] [-e | -l | -r]

参数说明:

-u user:用来设定某个用户的 crontab 服务,例如: “-u dh” ,表示设定 dh 这个用户的 crontab 服务,由于指定其它用户是需要权限的,所以一般只有 root 用户才使用该参数。

file:file 是命令文件的名字,表示将 file 做为 crontab 的任务列表文件并载入 crontab。如果在命令行中没有指定这个文件,crontab 命令将接受标准输入(键盘)上键入的命令,并将它们载入 crontab。

-e:编辑某个用户的 crontab 文件内容。不指定用户,默认使用当前用户。

-l:显示某个用户的 crontab 文件内容。不指定用户,默认使用当前用户。

-r:从 /var/spool/cron 目录中删除某个用户的 crontab 文件,不指定用户,默认使用当前用户。

2.2. 调度任务参数

具体格式如下:

1
2
3
4
5
6
7
8
9
10
# 下面的字段command必须指定,其它参数可选,如不指定用*代替
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令

Minute        每个小时的第几分钟执行该任务
Hour          每天的第几个小时执行该任务
Day           每月的第几天执行该任务
Month         每年的第几个月执行该任务
DayOfWeek     每周的第几天执行该任务
command       指定要执行的程序
2.3. 编辑 crontab 文件

编辑是最主要的功能,所以这里只以 -e 进行说明。

样例:每分钟执行一次任务,运行 /home/test.py

1
2
3
4
5
6
# 执行crontab命令配置定时任务
$ crontab -e

# 添加以下任务,最好对每条任务给以注释,保存后退出
# Run test.py every minute
* * * * * /home/test.py

样例:在上午 8 点到 11 点 的第 3 和第 15 分钟执行任务,运行 /home/test.py

1
2
3
4
5
# 执行crontab命令配置定时任务
$ crontab -e

# execute at 3 and 15 minutes from 8 am to 11 am
3,15 8-11 * * * /home/test.py

样例:每 5 小时执行一次任务,运行 home/test.py ,并将标准输出到 /home/log

1
2
3
4
5
# 执行crontab命令配置定时任务
$ crontab -e

# 自定义注释
* */5 * * * /home/test.py >> /home/log

样例:每月 1 号执行任务,运行 /home/test.py,忽略正常输出信息

1
2
3
4
5
# 执行crontab命令配置定时任务
$ crontab -e

# ignore stdout/errout
* * 1 * * /home/test.py > /dev/null

样例:每周的第 3 天执行任务,运行 /home/test.py, 忽略正常输出和错误输出信息

1
2
3
4
5
# 执行crontab命令配置定时任务
$ crontab -e

# ignore stdout/errout
* * * 3 * /home/test.py > /dev/null 2>&1

说明:/dev/null 代表空设备文件,重定向进去的信息就没有了,没有日志文件显示为空;标准键盘输入为 0,标准屏幕输出为 1,标准错误输出为 2,2>&1 表示将标准错误输出重定向到标准输出中;两者结合表示 1 > /dev/null 把标准输出和标准错误输出都重定向到空设备文件中(也就是忽略所有输出)。

3. 脚本文件

在定时任务脚本中,需要指明解释器绝对路径,否则任务不执行,两种方案:

  1. 脚本开头添加解释器位置,如:#! /usr/local/python3/python3.7,crontab 中就不用再指明路径
  2. crontab 中指定解释器绝对路径,脚本中就不再需要指明路径

在 Linux 中我格外安装了 Python3.7 ,安装路径在 /usr/local/python3,所以上面是我的解释器路径。使用 #! /usr/bin/env python3 虽然可以正常通过 Python3 直接执行脚本,但在 crontab 中却无法正常使用 Python3,这点有待探究。

方法一:(脚本内容如下)

1
2
3
4
5
6
7
#! /usr/local/python3/python3.7

import time

data = time.ctime() + "\n"
with open('./test.txt','a') as f:
f.write(data)

方法二:

1
2
3
4
$ crontab -e

# 添加任务
* * * * * /usr/local/python3/python3.7 ./home/test.py

4. 总结

这是 Linux 任务调度的全部内容,经过简单描述可以大致清楚 crontab 命令配置定时任务,任务参数如何设置,以及一些注意事项,尤其是第三点的路径问题。

Linux 相比于 Windows 确实更适合用来做开发,但前提是你需要熟练掌握其各种命令及参数的使用。