作业管理及任务计划
1. 作业管理
-
Linux的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
-
让作业运行于后台
- 运行中的作业:Ctrl+z ,送往后台并处于停止状态
- COMMAND&:
ping 172.20.50.160 &
-
让后台停止的程序继续运行
- 发送信号唤醒(-18为信号) ,唤醒后执行中断命令
kill -18 6731 进程编号6731
killall -18 ping 如果后台程序只有一个,也可以这样写
- 使用bg命令
[root@hai7 ~]$jobs <==取得后台程序编号 [1]+ Stopped ping 172.20.50.160 [root@hai7 ~]$bg 1 <==将后台程序1,在后台继续执行`
- 发送信号唤醒(-18为信号) ,唤醒后执行中断命令
-
终止后台作业
- fg把指定的后台作业调回前台,再执行终止指令
fg 1 <==将后台程序1,唤至前台
- kill[%JOB_NUM]:终止指定的作业
kill %1 <==1为后台程序编号
- fg把指定的后台作业调回前台,再执行终止指令
-
后台执行的作业,再次休眠,发送信号19
killall -19 ping
-
剥离与终端的关系,防止意外中断
- 命令nohup
默认情况会将输出结果定向到,当前目录新建的nohup.out文件中,不会在屏幕中打印
例如:执行ping命令时在其前加nohup,执行后切断网络,过一定时间连接网络,查看进程,或者jobs,剥离后执行的命令不会丢失 [root@hai7 ~]$nohup ping127.1 &> /dev/null&
- 命令screen
1. [root@hai7 ~]$screen <==执行命令建立会话 2. [root@hai7 ~]$ping 127.1 <==在会话中执行长时间后台任务 3. 在screen窗口键入C-a d <==从会话剥离,做别的事情 4. [root@hai7 ~]$screen -r <==回到会话,程序依然在进行
- 命令nohup
-
并行运行
同时运行多个进程,提高效率- 建立脚本,将多任务都放入脚本中,让其后台执行
'创建3个ping命令脚本' [root@hai6 ~]$cat 1.sh 2.sh 3.sh #FILENAME: 1.sh ping 127.1 #FILENAME: 2.sh ping 127.2 #FILENAME: 3.sh ping 127.3 '在命令行一起执行命令,各命令以;隔开,结果为顺序执行,也就是结束第一个,后续的才能执行' [root@hai6 ~]$./1.sh;./2.sh;./3.sh '将创建的脚本1.sh、2.sh、3.sh放入文件其后加&,如下所示' [root@hai6 ~]$cat v9.sh <=将3个脚本如新建的脚本,并后台执行 1.sh & 2.sh & 3.sh & [root@hai6 ~]$./v9.sh <=多任务并行执行
- 将脚本单个放入后台执行,创建子进程 ,实现并行执行
(./1.sh&);(./2.sh&);(./3.sh&);
- 放在大括号中,实现并行执行
{./1.sh& ./2.sh& ./3.sh& }
2. 任务计划
2.1 同步时间及启动服务
-
时间同步
任务计划前提是时间准确-
CentOS6中同步时间
- 选择一个服务器作为同步主体,这里以172.20.0.1为例
ntpdate 172.20.0.1
- 修改网络时间协议文件,以自动同步时间
vim /etc/ntp.conf
- 修改文件,增加server 172.20.0.1 iburst
[root@hai6 ~]$vim /etc/ntp.conf ......省略前面部分 # Use public servers from the pool.ntp.org project. <==找到这样的说明 # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 172.20.0.1 iburst <==增加此行,自动同步服务 server 0.centos.pool.ntp.org iburst <==这些为系统连接服务,可以考虑注释掉 server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst
- 确定开机自动开启服务,chkconfig --list ntpd
其中的0、1、2、3、4、5、6,表示运行级别runlevel
off为未启用,on为启用
[root@hai6 ~]$chkconfig --list ntpd ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@hai6 ~]$runlevel N 5
- 启动开机启动服务:chkconfig ntpd on
[root@hai6 ~]$chkconfig ntpd on [root@hai6 ~]$chkconfig --list ntpd ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- 查看当前是否已经启动ntpd服务
service ntpd status
- 启动服务
service ntpd start
- 选择一个服务器作为同步主体,这里以172.20.0.1为例
-
CentOS7中同步时间
工具:chrony
配置文件:/etc/chrony.conf- 首先同步时间,以172.20.0.1为例
ntpdate 172.20.0.1
- 修改配置文件/etc/chrony.conf
[root@hai6 ~]$vim /etc/chrony.conf # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 172.20.0.1 iburst <==增加行 server 0.centos.pool.ntp.org iburst <==pool的公共服务器,可以考虑注释掉 ...... <==省略中间 # Allow NTP client access from local network. #allow 192.168.0.0/16 <==修改为本网段的地址,允许本网络同步本机 # Serve time even if not synchronized to a time source. #local stratum 10 <==即使不能同步远程服务器,也可以提供对外服务
- 查看服务是否启动
$systemctl status atd
- 启动服务
systemctl start ntpd
- 查看是否为开机启动
$systemctl is-enabled ntpd
- 如果没有开启开机启动,使用如下命令
$systemctl enable ntpd
- 首先同步时间,以172.20.0.1为例
-
-
服务器集群之间的系统时间同步
在生产环境中,可以搭建一台内网时间服务器,然后让所有计算机都到服务端去同步时间即可- CentOS6
[root@hai6 ~]$vim /etc/ntp.conf ......省略前面部分 # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. # restrict default kod nomodify notrap nopeer noquery '注释掉上面这行,此项只运行主机同步别人' restrict -6 default kod nomodify notrap nopeer noquery ......省略中间部分 # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 172.20.0.1 iburst <==添加本地服务,以和其它主机同步 server ntp.aliyun.com iburst <==添加一个远程时间服务器
- CentOS7
[root@hai6 ~]$vim /etc/chrony.conf # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 172.20.0.1 iburst <==添加本地服务,以和其它主机同步 server ntp.aliyun.com iburst <==添加一个远程时间服务器 #server 0.centos.pool.ntp.org iburst <==pool的公共服务器,注释掉 ...... <==省略中间 # Allow NTP client access from local network. allow 172.20.0.0/16 <==修改为本网段的地址,允许本网络同步本机 # Serve time even if not synchronized to a time source. local stratum 10 <==启用,即使不能同步远程服务器,也可以提供对外服务
-
服务启动总结
-
CentOS7:以下命令中atd为服务名称,可替换,启动服务通用
- 查看当前是否启动:systemctl status atd
- 启动命令为:systemctl start atd
- 确保服务开机启动:systemctl enable atd
- 查看是否为开机启动的:systemctl is-enabled atd
- 查看防火墙状态:firewall-cmd --state
- 关闭防火墙:systemctl stop firewalld
- 禁止开机启动:systemctl disable firewalld
-
CentOS6
- 确保服务开机启动:chkconfig --list atd
- 修改启动模式:chkconfig atd on|off
- 查看当前是否启动:service atd status
- 启动服务:service atd start
- 查看防火墙状态:service iptables status
- 关闭防火墙:chkconfig iptables off
- 开机自启防火墙:chkconfig iptables on
-
关掉selinux
编辑/etc/selinux/config文件
找到行并改为:SELINUX=disabled
-
2.2 未来的某时间点执行一次任务
-
命令:batch
系统空闲时候执行一次任务 -
命令at
用于在指定时间执行任务,来自at包
依赖于atd服务,需要启动才能实现at任务- 格式
at [option] TIME
作业执行命令的结果中的标准输出和错误不会在屏幕上输出,以邮件通知给相关用户 - 选项
选项 作用 -V 显示版本信息 -l 列出指定队列中等待运行的作业;相当于atq -d 删除指定的作业;相当于atrm -c 查看具体作业任务 -f /path/file 指定的文件中读取任务 -m 当任务被完成之后,将给用户发送邮件,即使没有标准输出 -t 在指定时间执行任务,格式[[CC]YY]MMDDhhmm[.ss] - 任务存放目录
- 队列任务:
/var/spool /at/
- 用户控制,控制用户是否能执行at任务
/etc/at.allow
白名单
默认不存在,需自建,只有该文件中的用户才能执行at命令/etc/at.deny
黑名单
拒绝该文件中用户执行at命令,而at.deny文件外使用者均可执行- 如果两个文件都不存在,只有root可以执行at命令
- 白名单优先级高于黑名单,假设A用户同时存在于2个名单中,仍然可以执行at
- 白名单存在,而没有添加用户,只有root可以执行
- 队列任务:
- 支持的时间格式
- 在今日的HH:MM进行,若该时刻已过,则明天此时执行任务
HH:MM 02:00
- 规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM YYYY-MM-DD16:20 2018-09-07
YYYY-MM-DD HH:MM- t 201809071620
- 支持12小时表示,月份为英文单词
HH:MM [am|pm][Month][Date]
at 06pm September 07
9月7日下午6点 - 在某个时间点再加几个时间后才进行该项任务
HH:MM[am|pm]+number [minutes|hours|days|weeks]
now +5 min
五分钟以后
02pm +1 weeks
一周后下午2点
- 在今日的HH:MM进行,若该时刻已过,则明天此时执行任务
- 格式
-
示例
-
用at命令先来创建一个任务
[root@hai7 ~]$at 9:00 at> echo good good study <EOT> <==CTRL+d来结束输入 job 2 at Fri Sep 7 09:00:00 2018 "查看生成的任务计划" [root@hai7 ~]$ls /var/spool/at a000020186b25c spool <==会自动在此目录创建一个文件 [root@hai7 ~]$cat /var/spool/at/a000020186b25c ......前面内容省略 ${SHELL:-/bin/sh} << 'marcinDELIMITER68f6c111' echo good good study <==将要做的任务,可以编辑修改 marcinDELIMITER68f6c111 [root@hai7 ~]$at -l <==查看列队中的任务 2 Fri Sep 7 09:00:00 2018 a root [root@hai7 ~]$atq <==效果与at -l相同 2 Fri Sep 7 09:00:00 2018 a root [root@hai7 ~]$at -c 2 <==输出内容与/var/spool/at/任务文件相同,2为atq列出的等待任务编号
-
在2018年9月7日15点25分,将/data目录做备份
[root@hai7 ~]$at -t 201809071525 at> tar cvf data.tar /data &>/dev/null <==不接收输出邮件,导入垃圾箱 at> <EOT> <==CTRL+d来结束输入 job 10 at Fri Sep 7 15:25:00 2018 [root@hai7 ~]$at -l 10 Fri Sep 7 15:25:00 2018 a root
-
应用于脚本中
方法一 [root@hai7 ~]$!/bin/bash <==编写脚本t1.sh at 17:35<<EOF tar cvf data.tar /data &> /dev/null wall "ok!" EOF 方法二 [root@hai7 ~]$cat f1 <==将任务写入文件,管道传给at tar cvf data.tar /data &> /dev/null wall "ok!" [root@hai7 ~]$$cat f1|at now +5min 方法三 [root@hai7 ~]$at -f f1 now +5min <==应用-f选项,读取文件f1
2.3 周期性任务计划cron
-
cron相关程序包
- cronie:主程序包,提供crond守护进程及相关辅助工具
- CentOS7:
/usr/lib/systemd/system/crond.service
- CentOS6 :
/etc/rc.d/inin.d/crond
- CentOS7:
- cronie-anacron:cronie的补充程序,用于监控cronie任务执行情况,如cronie中的任务在过去该运行时间点未能正常运行,则anacron会随后启动一次此任务
后台自动运行程序anacron - crontabs:用于安排程序执行的root crontab文件;cronie等守护进程检查crontab文件查看何时安排执行特定命令。
其下/usr/bin/run-parts 脚本,可以调用/etc/cron.daily;/etc/cron.hourly;/etc/cron.monthly;/etc/cron.weekly里的所有计划任务,定期执行
- cronie:主程序包,提供crond守护进程及相关辅助工具
-
计划任务
- 确保crond守护处于运行状态,监控用户创建提交的相关计划任务,当条件满足,就会自动执行。
- 对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义
- root可以修改任何人的计划任务
2.2.1 全局cron任务
系统维护作业,只有root有权限
-
全局任务相关文件说明
- /etc/crontab
全局配置文件,编辑可建立计划任务 - /etc/cron.d/
相当于子配置文件,可以将计划任务单独建立文件,放在此目录下,用于多用户环境,区分使用,任务创建格式为- 子配置文件创建格式为
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root <==如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 01 * * * * root run-parts /etc/cron.hourly <==含义见全局配置文件
- /etc/cron.d/下0hourly文件
上面说的run-parts脚本每小时调用一次/etc/cron.hourly
[root@hai7 ~]$cat 0hourly # Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly
- 进入脚本/etc/cron.hourly
[root@hai7 ~]$cat /etc/cron.hourly/0anacron #!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; then <==查找没有执行的计划任务,自动执行 day=`cat /var/spool/anacron/cron.daily` fi if [ `date +%Y%m%d` = "$day" ]; then exit 0; fi # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then <==判断是否为电池供电 /usr/bin/on_ac_power >/dev/null 2>&1 if test $? -eq 1; then exit 0 fi fi /usr/sbin/anacron -s
- 日志文件
日志:/var/log/cron - 周期计划任务文件
/var/spool/cron - 用户控制文件
/etc/cron.deny(黑名单) - 管理临时文件
-
CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
-
CentOS7使用systemd-tmpfiles-setup服务实现清除临时文件
- 配置文件为/usr/lib/tmpfiles.d/tmp.conf
- 命令:systemd-tmpfiles-clean|remove|create configfile
-
- /etc/crontab
-
创建计划任务方法: 全局配置文件编 /etc/crontab
$vim /etc/crontab
# 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.定义时间 | 2.定义用户| 3.执行的操作 |
55 8 * * * root wall "hello!" <==例在每天的8点55广播hello!
-
定义时间的表示方法:
- 特定值
给定时间点有效取值范围内的值
59 23 31 12 *
每年的12月31日23:59 - *
给定时间点上有效取值范围内的所有值
表示“每。。。” - 离散取值 #,#
表示多个不连续的时段
30 8 10,20,30 * *
每月的10、20、30号的8点30分
30 4 1,15 * 5
表示1号、15号,以及每个星期五 - 连续取值 #-#
表示多个连续的时段
30 8-12 10 * *
每月10号8点到12点的第30分 - 在指定时间范围上,定义步长
*/5 * * * *
每5分钟
- 特定值
-
特殊时间格式写法
格式 | 对应时间参数 | 含义 |
---|---|---|
@reboot | Run once after reboot | |
@yearly | 0 0 1 1 * | 每年执行一次在1月1日0点0分 |
@annually | 0 0 1 1 * | 每年执行一次在1月1日0点0分 |
@monthly | 0 0 1 * * | 每月执行一次在1日0点0分 |
@weekly | 0 0 * * 0 | 每周执行一次在周日0点0分 |
@daily | 0 0 * * * | 每天执行一次在0点0分 |
@houly | 0 * * * * | 每小时执行一次在0分 |
- 示例
示例1:执行多任务写法,每3小时echo和wall命令,每个任务直接以;隔开
0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “welcome to Magedu!”
示例2:破坏性示例:无限重启
# * * * * * user-name command to be executed
@reboot root reboot
示例3:修复示例2:
- 重启在如下画面中输入e
- 进入如下画面,如图中linux16行尾,加上rd.break字符串(蓝色部分),不要回车
- 组合键CTRL+x,进入特殊模式emergency,输入mount查看挂载情况,如图,根挂载于/sysroot下
- 此时根目录为只读模式,重新挂载为读写模式
mount -o remount,rw/sysroot
- 将任务计划删除
vim /sysroot/etc/crontab
2.2.1 anacron系统
由/etc/cron.hourly/0anacron执行
当执行任务时,更新/var/spool/anacron/cron.daily文件的时间戳
- 配置文件:
/etc/anacrontab
负责执行/etc/cron.daily; /etc/cron.weekly ;/etc/cron.monthly中系统任务- 配置文件内容
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 <==当很多任务需要重新执行时,随机延迟,错开执行 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 <==在此时间范围内,系统才会执行检测到的任务 | 1 | 2 | 3 | 4 | #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
- 内容概要
- 字段1:在这个时间段里没有运行这些任务
- 字段2:在重新引导后等待这么多分钟后运行它
- 字段3:任务识别器,在日志文件中标识
- 字段4:要执行的任务
2.2.1 用户cron任务
-
每个用户都有专用的cron任务文件
/var/spool/cron/USERNAME -
这个编辑没有颜色,可以执行export EDITOR=vim
保存设置,在目录/etc/profile.d/下建立以.sh后缀的文件将export EDITOR=vim让在文件中 -
控制用户执行 计划任务
/etc/cron.{allow,deny} -
创建计划任务: crontab命令
- 格式: crontab [-u user] [-l|r|-e] [-i]
- 选项
选项 含义 -l 列出所有任务 -e 编辑任务 -r 移除所有任务 -i 同-r一同使用,以交互式模式移除指定任务 -u user 仅root可运行,指定用户管理cron任务 -
创建格式
时间设置+命令,不需要写用户,可以添加多行
* * * * * wall hello
-
示例
- 指定v9用户创建计划任务
crontab -u v9 -e
- 如何实现每7分钟运行一次任务,/7是除不尽的,任务到后来就不会执行
方法:将分转换为秒,然后循环执行 - 如何在秒级别运行任务?
执行任务休眠20秒,再执行,再休眠20秒。。。
*****for min in 0 1 2; do echo 'hi'; sleep 20; done
- 指定v9用户创建计划任务
-
sleep命令:
- 格式:sleep NUMBER [SUFFIX]
- SUFFIX:
s: 秒,默认,支持0.01秒
m: 分
m: 小时
m: 天
-
usleep命令
- 格式
usleep <us>
睡眠多少微妙 - 示例:比较sleep与usleep精度
[root@hai7 ~]$date +%S.%N;usleep 3000000;date +%S.%N 43.784830122 46.797193094 [root@hai7 ~]$date +%S.%N;sleep 3;date +%S.%N 06.507325464 09.517159317
- 格式