作业管理
·Linux的作业控制:
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
·如何让作业运行于后台?
(1)运行中的作业: Ctrl+z
(2)尚未启动的作业:# COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
命令:
# nohup COMMAND &
# screen;COMMAND
·查看所有作业:
# jobs
·作业控制:
# fg [[%]JOB_NUM] :把指定的后台作业调回前台
# bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行
# kill [%JOB_NUM] :终止指定的作业
·并行运行:
同时运行多个进程,提高效率
(1)vi all.sh 写一个脚本
f1.sh&
f2.sh&
f3.sh&
(2)(f1.sh&);(f2.sh&);(f3.sh&)
(3){ f1.sh& f2.sh& f3.sh& }
·进程优先级:
PRI优先级于系统优先级相反(ps命令中的参数)
系统: 0 —- 139
PRT: 139 —- 0
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice 值为0 ,优先级为120
只有根用户才能降低nice值(提高优先性),其他用户只能提高自己所发起进程的nice
·nice 命令:
nice [OPTION] [COMMAND [ARG]…]
~]# nice -n -5 ping 127.0.0.1
~]# nice –5 ping 127.0.0.1
调整即将运行的程序的优先级
·renice 命令:
renice [-n] priority pid…
~]# renice -20 6754
~]# renice -n -10 6754
renice调整运行中的优先级
·查看:
ps axo pid,comm,n
Linux任务计划、周期性任务执行
·未来的某时间点执行一次任务:at、batch
·周期性运行某任务:crontab
·执行结果: 会通过邮件发送给用户
查看邮件服务是否打开:(25号端口)
# netstat -tnlp
# ss -tnlp
·本地电子邮件服务:
smtp:simple mail transmission procotol
pop3:Post office Procotol
imap4:Internet Mail Access Procotol
·mail:命令
mailx – send and receive Internet mail
MUA:Mail User Agent. 用户收发邮件的工具程序
mail/mailx [-s 'SUBJECT'] username [@hostname]
邮件正文:
(1)输入重定向
(2)通过管道
(3)交互式输入
at命令:
·at [option] TIME
·常用选项:
-l:列出指定队列中等待运行的作业;相当于atq
-d:删除指定的作业;相当于atrm
-c:查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务 被完成之后,将给用户发送邮件,即使没有标准输出
-q QUEUE:指明队列
-V:显示版本信息
·注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
·TIME:定义出什么时候进行at这项任务的时间
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+# {minutes,hours,days, OR weeks}
·at时间格式
HH:MM ==> 02:00
在今日的HH:MM进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD ==> 04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
04pm + 3 days
·执行方式:
1)交互式
2)输入重定向
3)at –f 文件
·依赖与atd服务, 需要启动才能实现at任务
服务: service atd status
·at队列存放在/var/spool/at目录中,可以通过修个文件来改变队列中的命令
·通过/etc/at.{allow,deny}控制用户是否能执行at任务
·先寻找/etc/at.allow文件,文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at(即使没有写在at.deny当中)
·如果/etc/at.allow找不存在,就寻找/etc/at.deny这个文件,若写在这个at.deny用的使用者则不能使用at,而没有在这个at.deny文件中的使用者则可使用at命令
·如果两个文件都不存在有,只有root用可以使用at这个命令
# cat /etc/at.deny //文件格式
gao //禁止使用at命令的USERNAME
hlr
·batch命令:
batch会让系统自行选择空闲时间去执行此处指定的任务
常用选项同at命令
周期性任务计划:cron
·相关的程序包:
cronie:主程序包,提供crond守护进程及相关辅助工具
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
crontabs :包含CentOS提供系统维护任务
·确保crond守护处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
·计划周期性执行的任务提交给crond,到指定时间会自动运行
cron任务分为两类:
系统cron任务:主要用于实现系统自身的维护
手动编辑/etc/crontab文件
用户cron任务:
命令:crontab命令
·日志:/var/log/cron
·系统cron的配置文件:/etc/crontab
注释行以#开头
详情参见man 5 crontab
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
注意:
(1)每行定义一个周期任务,共7个字段
* * * * * :定义周期性时间
user-name :定义运行任务的身份
command to be executed :任务
(2)此处的环境变量不同于用户登录后获得的环境变量,因此建议命令使用绝对路径或者定义PATH环境变量
(3)执行结果以邮件发送给MAILTO指定的用户
·用户cron的配置文件:/var/spool/cron/USERNAME
# 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
# | | | | |
# * * * * * command to be executed
注意:
(1)每行定义一个周期任务,共6个字段
(2)此处的环境变量不同于用户登录后获得的环境变量,因此建议命令使用绝对路径或者定义PATH环境变量
(3)邮件发送给用户
·时间表示法:(5个 * * * * * 的表示法)
(1)特定值;
给定时间点有效取值范围内的值
注意:day of month(3) 和 day of week(5) 同时使用表示或的关系
(2) *
给定时间点上有效取值范围内的所有值,表示“每…”
(3)离散取值:,
在时间点上使用逗号分隔多个值
#,#,#
(4)连续取值:-
#-#
(5)在指定时间范围上,定义步长:
*/#: # 即为步长
例如:每3小时echo 命令;
0 */3 * * * centos /bin/echo "howdy!"
例如:晚上9点10分运行echo命令;
10 21 * * * centos /bin/echo "Howdy!"
例如:
(1) 3 * * * * :每小时的第3分钟执行
(2) 3 4 * * 5 :每周五的04:03执行
(3) 5 6 7 * * :每月7号的06:05执行
(4) 7 8 1 2 * :每年的2月1号08:07执行
(5) 8 8 * * 3,7 :每周三和周日08:08执行
(6) 0 8,20 * * 1,5 :每周1周五08:00和20:00执行
(7) 0 9-18 * * 1-6 :每周1-6的09:00-18:00每小时执行一次
(8) */5 * * * * :每5分钟执行一次
(9) */7 * * * * :每7分组执行一次,但最后一次4分组执行
·特殊时间格式
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
·系统的计划任务配置文件:
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 每小时脚本
/etc/cron.daily/ 每天脚本
/etc/cron.weekly/ 每周脚本
/etc/cron.monthly/ 每月脚本
·anacron系统:
运行计算机关机时cron不运行的任务,CentOS6.0 以后版本取消anacron服务,由crond服务管理
假设计算机没有一直开机
对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要
对偶尔要关机的服务器很有用
配置文件:/etc/anacrontab,负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly 中系统任务。/etc/cron.hourly/ 由/cron.d/0hourly 执行
字段1 :如果在这些日子里没有运行这些任务……
字段2 :在重新引导后等待这么多分钟后运行它
字段3 :任务识别器,在日志文件中标识
字段4 :要执行的任务
·管理临时文件:
rhel6.0 使用/etc/cron.daily/tmpwatch 定时清除临时文件
rhel7.0 使用systemd-tmpfiles-setup 服务实现
·crontab命令定义了每个用户都有专用的cron任务文件:
/var/spool/cron/USERNAME
·crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-e:编辑任务;
-l:列出所有任务;
-r:移除所有任务;
-i:同 -r 一起使用,以交互式模式移除指定任务
-u user:仅root可运行,指定用户管理cron任务
·控制用户执行计划任务 :
/etc/cron.{allow,deny}
·先寻找/etc/cron.allow文件,文件中的使用者才能使用crontab,没有在这个文件中的使用者则不能使用crontab(即使没有写在cron.deny当中)
·如果/etc/cron.allow找不存在,就寻找/etc/cron.deny这个文件,若写在这个cron.deny用的使用者则不能使用crontab,而没有在这个cron.deny文件中的使用者则可使用crontab命令
·如果两个文件都不存在有,只有root用可以使用crontab这个命令
·注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
·对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
·思考:
(1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何实现每7分钟运行一次任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 7m; done
sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s:秒, 默认
m:分
h:小时
d:天
at和crontab
一次性作业使用 at
重复性作业使用crontab
Create at time crontab -e
List at -l crontab -l
Details at -c jobnum N/A
Remove at -d jobnum crontab -r
Edit N/A crontab -e
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
作业
1、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 cp /var/log/messages /logs/messages-`date +\%Y\%m\%d`
2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * grep "^[SM]" /proc/meminfo >> /tmp/meminfo.txt
原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/45282