在ubuntu或centos中,可以通过crontab命令来设置定时任务。下面主要介绍命令的使用方法以及我在使用这个命令时遇到的一些坑。
1. crontab命令
首先,通过crontab -e来用编辑要执行的定时任务(默认用vim打开,编辑完任务后记得用:wq
保存),其格式如下:
1
2
3
4
5
6
7
8
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * user-name command to be executed
底下的5个星号对应要执行任务的时间,每个星号所代表含义及取值范围格式中已经说明,其后跟着要执行的命令。下面给出一些示例(执行这些示例并不能在当前终端上输出,第2节会给出说明):
1
2
3
4
00 21 11 09 * date # 每年9月11号21:00执行date命令
00 21 11 * * date # 每月11号21:00执行date命令
00 21 * * 0 date # 每周日21:00执行date命令
15 * * * * date # 每个小时的第15分钟执行date命令
上例可以看出来,*
代表取所有候选值,如果想在部分时间执行命令可以使用 -
或者,
连接,如果想固定时间间隔执行命令可以使用/
,示例如下:
1
2
3
00 21 1,15 * * date # 每月1号和15号21:00执行date命令
00 21 1-3 * * date # 每月1号到3号21:00执行date命令
*/15 * * * * date # 每15分钟执行date命令,注意这个时间
crontab命令的部分其他使用方法如下:
1
2
3
crontab -l # 显示设好的所有定时任务
crontab -l -u username # 显示username用户设好的所有定时任务
crontab -r # 删除所有定时任务
需要注意,创建的定时任务最少要过两分钟才会执行(如果设置每分钟执行,那么前两分钟不会执行),可以通过service crond restart
命令使新建的任务立即生效。
2. 定时任务的一些问题
(1)所执行的命令输出不显示在当前终端。当定时任务*/1 * * * * date
生效后,你会发现在当前终端上并不会每分钟输出当前时间。通过输出重定向*/1 * * * * date >> tmp.txt
可以发现命令确实执行了。
(2)因为要执行的命令或脚本有误(包括各种运行时错误,语法错误等),定时任务未执行。由于输出并不显示在当前终端,当执行发生错误时,我们并不能看到错误信息。尽量在写入crontab任务列表前检查脚本是否正确以及多使用重定向输出到文件,通过输出文件判断错误。
(3)环境变量问题。上一条说到最好提前检查脚本是否正确,而环境变量这个问题会使得自己执行脚本没有问题,一写入crontab就各种报错(通常是找不到包或者命令)。这是因为crontab的环境变量和系统的环境变量不同,本人就在运行和CUDA有关的任务时未添加环境变量PATH
和LD_LIBRARY_PATH
踩坑。因此,如果自己写脚本,一定注意要配置环境变量。
(4)使用ssh登录远程服务器设置定时任务时,不需要使用nohup命令来保持在ssh断开后任务仍能正常运行。