进程管理工具及任务计划
Linux任务计划、周期性任务执行 未来的某时间点执行一次任务:at, batch 周期性运行某任务: cron 电子邮件服务: smtp: simple mail transmission protocol, 用于传送邮件; pop3: Post Office Protocol imap4:Internet Mail Access Protocol # netstat -tnlp # ss -tnl mailx - send and receive Internet mail MUA:Mail User Agent,用户首发邮件工具 mailx [-s 'SUBJECT'] username[@hostname] 邮件正文的生成: (1) 直接给出,Ctrl+d; (2) 输入重定向; (3) 通过管道; echo -e "How are you?\nHow old are you?" | mail mailx at命令: at [option] TIME TIME: HH:MM [YYYY-mm-dd] noon, midnight, teatime tomorrow now+#{minutes,hours,days, OR weeks} 常用选项: -q QUEUE: 指定队列 -l: 列出指定队列中等待运行的作业;相当于atq -d: 删除指定的作业;相当于atrm -c: 查看具体作业任务; -f /path/from/somefile:从指定的文件中读取任务; [root@centos7 ~]# vim at.task 1 cat /etc/inittab 2 echo "hello at ... " [root@centos7 ~]# at -f at.task now+1min 注意:作业的执行结果以邮件通知给相关用户; batch命令: 让系统自行选择空闲时间去执行此处指定的任务; 周期性任务计划:cron 相关的程序包: cronie: 主程序包,提供了crond守护进程及相关辅助工具; cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务; crontabs:包含CentOS提供系统维护任务; 确保crond守护处于运行状态: CentOS 7: systemctl status crond ...running... CentOS 6: service crond status 计划要周期性执行的任务提交给crond,由其来实现到点运行。 系统cron任务:系统维护作业 /etc/crontab 用户cron任务: crontab命令 系统cron任务 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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 注意: 1.每一行定义一个周期性任务; * * * * * : 定义周期性时间 user-name : 运行任务身份 command to execute :任务 2.此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义path环境变量; 3.执行结果邮件发送给mailto指定的用户; 用户cron的配置格式: /var/spool/cron/USERNAME SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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 注意: 1.每一行定义一个周期性任务;共6个字段; * * * * * : 定义周期性时间 user-name : 运行任务身份 command to execute :任务 2.此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义path环境变量; 3.邮件发送给当前用户; 例如:晚上9点10分运行echo命令; 10 21 * * * gentoo /bin/echo "Howdy!" 时间表示法: (1) 特定值; 给定时间点有效取值范围内的值; 注意:day of month 和 day of week一般不同时使用; (2) * 给定时间点上有效取值范围内的所有值; 表示“每...”; (3) 离散取值:, #,#,# (4) 连续取值:- #-# (5) 在指定时间范围上,定义步长: /#: #即为步长 注意: 指定的时间不能被步长整除时,其意义将不复存在; 最小时间单位为"分钟",想完成"秒"级任务,的需要额外借助其他机制; 定义成每分钟任务:而在利用脚本实现在每分钟之内,循环执行多次; 例如: 0 */3 * * * :每3小时echo命令; 3 * * * * : 每小时执行一次;每小时的第3分钟; 3 4 * * 5 : 每周执行一次;每周五4点3分; 5 6 7 * * : 每月执行一次;每月的7号的6点5分; 7 8 9 10 *: 每年执行一次;每年的10月8点7分; 9 8 * * 3,5: 每周三和周五;8点9分执行一次; 0 8,20 * * 3,7 : 每周三和周日,8点和20点; 0 9-18 * * 1-5 : 工作日内的每小时 用户cron: crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME crontab命令:所有任务立即生效; crontab [-u user] [-l | -r | -e] [-i] -l: 列出所有任务; -e: 编辑任务; -r: 移除所有任务;想要删除某一条任务crontab -e ; -i:同-r一同使用,以交互式模式让用户有选择地移除指定任务; -u user: 仅root可运行,可为指定用户管理cron任务; 注意:运行结果以邮件通知给相关用户;如果拒绝接受邮件; (1) COMMAND > /dev/null (2) COMMAND &> /dev/null 注意: 对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义; 思考: (1) 如何在秒级别运行任务? * * * * * for min in 0 1 2; do echo "hi"; sleep 20; done (2) 如何实现每7分钟运行一次任务? (3)某任务在指定的时间内因关机未能执行,下次开机会不会自动执行? 不会! 如果期望下次开机是否到了相应时间点都要执行一次,可使用anacron实现; sleep命令: sleep NUMBER[SUFFIX]... SUFFIX: s: 秒, 默认 m: 分 h: 小时 d: 天 anacron命令: anacron [-s] [-f] [-n] [-d] [-q] [-t anacrontab] [-S spooldir] [job] anacron [-S spooldir] -u [-t anacrontab] [job] anacron [-V|-h] anacron -T [-t anacrontab] 练习: 1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”; 2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”; 3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中; 4、工作日时间内,每小执行一次“ip addr show”命令; 回顾:进程管理工具、任务计划 进程管理工具:pmap, glances, vmstat, dstat, kill, jobs, bg, fg, nice, renice, pidof 任务计划: 一次性执行某任务:at, batch 周期性执行某任务:crond --> anacron * * * * * COMMAND