Linux计划任务
linux
计划任务
一次性任务计划:at, batch
周期性任务计划:cron
周期性任务计划:cron
依赖于后台服务,查看运行状态:
service crond status
crond(pid1680)isrunning...表示正在运行
cron任务有两类:
系统cron:/etc/crontab
用户cron:定义在/var/spool/cron/目录中与用户名同名的文件中
每行定义一个独立的任务:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# 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
时间点(周期性任务)
user-name:用户身份
command:要运行的任务
注意:建议在定义cron任务时,所用到的命令使用绝对路径;如果脚本,脚本中的命令使用绝对路径 ,或自定一个拥有完整路径的环境变量;
时间
分钟 小时 天 月 周几
注意:天 月和周几一般不同时设置,因为所有时间点要同时满足
每年5月4号3点2分:2 3 4 5 *
每月6号18点20分:20 18 6 * *
每天9点20分:20 9 * * *
每小时的3分时:3 * * * *
每分钟:* * * * *
每周三17点16分:16 17 * * 3
时间表示法:每个时间位都应该使用其可用的有效取值范围内的值;*就用于表示使用其所有有效取值;
17 * * * * /bin/echo "howdy" 每小时的17分时执行一次
8 9 * * * /bin/echo "howdy"每天的09:08执行
16 17 * * 3 /bin/echo "howdy"每周三的17:16执行
*/#:在对应的时间位有效取值上每#个时间单位一次
*/3 * * * * /bin/echo "howdy"每天每三分钟一次
9 */3 * * * /bin/echo "howdy"每3小时的09分时一次
*/7 * * * * /bin/echo "howdy"
注意:并不能精确做到每7分钟一次;
连续时间点:-
40 3 * * 1-5 /bin/echo "howdy"每周1-5的3:40执行
离散时间点:,
30 2 * * 2,4,6 /bin/echo "howdy"每周的2,4,6的2:30执行任务运行后的结果:邮件发送给任务相关用户;
丢弃邮件通知:输出重定向
COMMAND > /dev/null
COMMAND &> /dev/null
COMMAND > /dev/null 2>&1
例: 30 2 * * 2,4,6 /bin/echo "howdy" &>/dev/null
/dev/null: 软件模拟出的设备,bit bucket,数据黑洞;
crontab命令
crontab命令:
-l: 列出已经定义的所有任务;
-e: 打开编辑界面定义任务;
-r: remove,移除所有任务;
-u USERNAME :root以其他用户的身份运行crontab
-l: 列出已经定义的所有任务;
-e: 打开编辑界面定义任务;
-r: remove,移除所有任务;
crontab会检查语法,并保存在/var/spool/cron/用户名 目录中
注意:删除一个任务应该通过编辑界面删除行实现;
注意:如果crontab中的用户命令中需要使用%时,需要对其进行转义:
*****/bin/touch file-$(date+\%F-\%H-\%M-\%S)
*****/bin/touch file-$(date+'%F-%H-%M-%S')
加锁
当不确定一个cron任务是否会在下一次执行是执行完本次任务,可以考虑用加锁的机制不重复执行,而是执行完一次后在进行下一次。
例:
*/20 * * * * flock -xn /tmp/room_delete.lock-c'cd /www/; php room_delete.php > /dev/null'