作业管理
我们在ping一台主机的时候,返回的结果一直占据着终端无法释放。这时我们需要打开另一个终端来继续完成别的任务。还有我们晚上在执行脚本时,我们希望它能自动在后台运行,等第二天回来直接看结果就好。想实现这样的功能,就得依靠作业管理功能。
作业控制:
- 前端作业:通过终端启动,且启动后一直占据着终端
- 后端作业:可通过终端启动,但启动后即转入后台运行。
让作业运行于后台:
- 运行中的作业:Ctrl+z
- 尚未启动的作业:COMMAND &
上述两种情况虽然在后端运行,但是其还是与终端有关,终端退出之后,作业也就自动关闭,如果想剥离终端运行,可以使用下面两个命令 - nohup COMMAND &> /dev/null &
- screen;COMMAND
查看当前终端的所有作业:jobs
作业控制:
- fg [[%]JOB_NUM]:把指定的作业送到前台
- bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
- kill [[%]JOB_NUM]:终止指定的作业
示例:
[root@centos7 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=46 time=18.6 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=46 time=17.2 ms
^Z
[1]+ 已停止 ping baidu.com
运行中使用Ctrl+z效果
[root@centos7 ~]# ping baidu.com &>/dev/null &
[1] 8098
&后台运行效果
[root@centos7 ~]# jobs
[1]- 已停止 ping baidu.com &>/dev/null
[2]+ 已停止 ping sohu.com
[root@centos7 ~]# fg 2
ping sohu.com
64 bytes from 123.125.116.28 (123.125.116.28): icmp_seq=4 ttl=49 time=17.4 ms
将第二个任务放到前端执行
[root@centos7 ~]# nohup ping baidu.com
nohup: 忽略输入并把输出追加到"nohup.out"
nohup会把输出的信息追加到nohup.out文本里,如果不停止,会一直往文本里写东西
任务计划
在特定的时间或者每次同样的时间去执行任务,就是任务计划。
- 在未来的某个时间点干一件事情。
- at
- batch:系统自行选择空闲时间去执行此处指定的任务
- 周期性执行某任务
- cron
at
at命令:at [option] TIME
常用选项:
-V:列出版本信息
-l:列出指定队列中的等待运行的作业,相当于atq
-d:删除指定的作业;相当于atrm
-c:查看具体作业
-f /path/to/somefile :从指定的文件中读取任务
-m:当任务被完成之后,给用户发邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和错误都以邮件方式发送给用户
指定什么时间执行任务
HH:MM [YYYY-mm-dd] 具体时间
noon, midnight, teatime(4pm)
tomorrow 明天
now+\#{minutes,hours,days, OR weeks} 从现在开始往后
示例:
[root@localhost ~]# at now+3min
at> rm -rf /data/*
at> <EOT>
job 4 at Wed Nov 20 02:36:00 2019
3分钟后执行删除data下数据的任务
at时间格式
HH:MM 如02:00
在今日的HH:MM执行任务,如果该时间已过,将第二天执行
HH:MM YYYY-MM-DD 如02:00 2019-11-21
规定在某年某月末日的某一天的某个时刻执行该任务
at任务执行方式
1)交互式,Ctrl+d提交 2)输入重定向 3)at -f文件
示例:
[root@localhost ~]# at now+1min -f f1.sh
job 5 at Wed Nov 20 02:46:00 2019
1分钟后执行f1脚本
注意:
at命令可以利用配置文件来控制用户是否能执行at任务
/etc/at.{allow,deny}控制用户是否能执行at任务
白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
如果两个文件都不存在,只有 root 可以执行 at 命令
使用交互式命令时,ctrl+d保存任务
cron命令
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来。所以我们要确保crond服务启动。
/etc/crontab的文件内容
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
总共有五颗星,分别表示:分,小时,天,月,星期
user-name :运行任务的用户身份
command to be executed:要执行的任务
时间表示法:
1、特定值:
给定时间点有效取值范围内的值
2、*
给定时间点上有效取值范围内的所有值,表示“每”
3、#,# #
指定时间的离散值,在特定的时间点上使用“,”分隔开,
4、连续取值:-
在时间点上使用-连接开头和结束
5、在指定的时间点上,定义步长
/# :#即步长
注意:
指定的时间点不能被步长整除时,其意义将不复存在
最小时间单位为“分钟”,想完成“秒”级任务,得需要额外借助于其它机制
定义成每分钟任务,利用脚本实现在每分钟之内。循环执行n次
示例:
1 2 * * * 表示每天的2点零1分
1 * * * * 表示在每小时的第1分钟
3 4 * * 5 表示每周五的4点3分
5 6 7 * * 每月的7号6点5分
0 9-18 * * 1-5:周一到周五 9点到18点每小时执行一次
** crontab命令**
crontab [-u user] [-l | -r | -e] [-i]
-e:编辑任务;
-l:列出所有任务
-r:移除所有任务;即删除/var/spool/cron/USERNAME文件
-i:在使用-r选项时移除所有任务,提示用户确认
-u USERNAME:root用户可为指定用户管理cron任务