linux任务管理与计划

linux系统作业控制的命令:

    job(作业):一个作业通常包含多个命令(也有可能只包含一个),联合起来由单个小程序组合,完成复杂任务,对Linux而言作业有两种;前台作业和后台作业   

    前台作业(forgroud):通过终端启动,且启动后会一直占据终端;例如:vim,cp等

    后台作业(backgroud):可以通过终端启动,但启动后其转入后台运行(释放终端),有些服务类进程,都是运行在后台的。甚至有些服务类进程有能力运行在后台,但它不是默认的,你需要手工指定让其运行在后台。

大多数情况下,如果我们在命令行运行的命令不支持前台运行的话,它将直接运行在后台

如何让作业运行与后台?(有两种方式)

(1)运行中的作业

ctrl+z(注意:此种方式送往后台,作业会转为停止态)

(2):尚未启动的作业

#command & (在运行时,命令后边加一个&符号,这就表示把它送往后台了,此种方法即便是送往后台,他仍然是与终端相关的;进程有两类;与终端相关的进程和与进程无关的进程,任何与终端相关的进程,只要终端终止了,进程也一定会终止,哪怕运行与后台也是如此)

注意:此类作业虽然被送往后台,但其依然与终端相关;如果希望把送往后台的作业剥离与终端的关系

# nohup command & (这表示把其运行为作业以后立即转为与终端无关模式)

使用jobs命令可以查看后台的作业列表

示例:

blob.png

blob.png

调往后台的作业的控制命令

    fg:[[%]job_num]把作业从后台调往前台;把指定的作业调回前台

    bg:[[%]job_num]让后台那些停止的作业继续运行;让送往后台的作业在后台继续运行

blob.png

    kill:[[%]job_num]]此kill是为了kill作业的,不是kill进程的;终止指定的作业

blob.png

    注意:这些命令可以在运行时直接带上作业号来执行;例如# fg [%[job_num]],%号可省,作业号就是使用jobs命令在行首所查看到的号码,如果我们在执行这些命令的时候没有指明作业号的情况下,jobs命令下看到的+号作业是默认首先被执行的作业,依次是—号;这就是它的优先级。对于kill命令,%号和作业号不可省略

并行运行:同时运行多个进程:开启多个子进程同时执行任务

    命令格式

    (cmd&);(cmd&);(cmd&)

]# (ping 10.1.0.1&);(ping 10.1.249.189&);(ping 10.1.252.213&)

blob.png

    {cmd& cmd& cmd&}



linux任务计划:就是让用户需要执行的任务在未来的某一时间点自动执行。linux的任务计划分为两类;但一次性任务计划,和周期性任务计划;

    at命令:处理仅执行一次就结束任务计划的命令。

    batch命令:batch会让系统自行选择在系统资源较空闲的时间去执行指定的任务;无需指明执行任务的时间

    crontab:这个指令所设置的任务将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,也可以编辑 /etc/crontab 。 至于让 crontab 可以生效的服务则是 crond 这个服务喔

    所有的这些任务的执行结果都会通过邮件发送给用户;首先使用~]# netstat -tnlp和~]# ss -tnl命令来查看25端口,确认邮寄服务开启


    at:命令:要使用一次性任务计划时,系统上面必须要有atd这个服务。 不过并非所有的Linux distributions 都默认会把他打开的,所以呢,某些时刻必须要手动将他启用才行。命令格式;at [option]…TIME;at的作业有队列,用单个字母表示,默认都使用a队列;at命令支持脚本参数,但是其运行环境略有不同,有些命令需要指明绝对路径才行

    常用选项

    -l:查看作业队列,相当于atq

    -f:/path/from/somfile:从指定文件中读取作业任务(将要执行的任务编辑在一个文件中),而不用在交互式输入;

    -d:删除指定的作业,相当于atrm(需指明作业号,例如 at -d 3,atrm 3)

    -c:查看指定作业的具体内容,(需指明作业号)

    -q QUEUE:指明队列;

    TIME的表示格式:

    HH:MM [YYYY-mm-dd]小时分钟(年月日可省)

    noon(中午12点),midnight(午夜12点),teatime(下午4点)

    tomorrow(明天)

    now+#:从现在起往后多次时间(需要指定一个时间,UNIT(时间单位):minutes(分钟),hourem(小时),days(天),OR weeks)

     at命令的黑名单/etc/at.deny 这个文件,若写在这个 at.deny 的用户名则不能使用 at ,而没有在这个 at.deny文件中的使用者,就可以使用 at

    at命令的白名单/etc/at.allow 这个文件,写在这个文件中的用户名才能使用 at ,没有在这个文件中的用户则不能使用 at(即使没有写在黑名单当中也不能使用at命令)

    如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

    注意:作业执行结果是以邮件发送给提交作业的用户,计划任务不要有标准输出,因为都发送到邮件里会造成资源浪费以及大量垃圾邮件的产生   

示例:

    blob.png    计划12点12分执行ls /etc/ 和echo命令

    blob.png    计划从现在起一分钟后执行 echo "lala"命令

    blob.png    查看计划列表

batch命令:batch会让系统自行选择在系统资源较空闲的时间去执行指定的任务;所有其他任何特性都与at命令相同


    crontab命令:arcontab周期性任务计划是由cron(crond) 这个系统服务来控制的。cron服务要一直处于运行状态来保证周期性任务计划的运行,这个服务要一直运行在后台,在某个时间点要检查哪些个周期性任务符合执行条件,而后让其运行。Linux 系统上面原本就有非常多的周期性任务计划,这叫做系统性周期任务计划,主要用于实现系统自身的维护;这类任务应该要在装完系统之后让其自动运行的(例如清除tmp目录下的文件),系统cron任务只能是手动编辑:/etc/crontab文件。因此这个系统服务是默认启动的。向cron提交作业的方式不同于at,他需要使用专用的配置文件,此文件有固定格式而且是系统性的周期任务计划,不建议使用文本编辑器直接编辑此文件/etc/crontab;因为大多数系统cron任务,系统在安装的时候就已经创建完成了 ,我们无需去指定。由于用户自己也可以进行周期性任务计划,所以用户控制周期性计划任务的命令是(crontab);当用户使用crontab这个命令来创建周期性任务计划之后,该项任务就会被纪录到/var/spool/cron/目录下,而且是以用户名来命名文件的,举例来说,root使用 crontab 后, 他的任务计划会被记录到/var/spool/cron/root里头去!但请注意,不要直接编辑该文件, 因为可能由于输入语法错误,导致任务无法执行,cron服务执行的每一项工作都会被纪录到/var/log/cron这个登录文件中,所以,如果你的 Linux 不知道有否被植入木马时,也可以搜索一下 /var/log/cron 这个登录文件!

    与at命令相同crontab命令同样用于黑名单和白名单

    黑名单:/etc/cron.deny文件,将不可以使用crontab命令的用户名写入其中,若未记录到这个文件当中的用户,就可以使用crontab。

    白名单:/etc/cron.allow文件,将可以使用crontab命令的用户名写入其中,若不在这个文件内的用户则不可使用crontab

    用户使用crontab命令执行周期性任务计划时首先要确保crond守护进程(daemon)处于运行状态;centos6和centos7不一样的确认方式不一样

    centos7使用systemctl status crond.service

    如果显示Active:active(running)则表示服务是运行的:如下图

blob.png

    centos6使用service crond status 命令 

    如果回显crind is running…则表示服务是运行状态的:如下图

blob.png

系统cron的配置格式:/etc/crontab

blob.png注意:

    (1)每一行定义一个周期性任务,共7个字段

    * * * * *:定义周期性时间

    user-name:运行任务的用户身份

    command to be executed:任务

    (2)此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义PATH环境变量;

    (3)执行结果邮件发送给MAILTO指定用户

用户cron的配置格式:/var/spool/cron/USERNAME

注意

    (1)每行定义一个cron任务,共6个字段

    (2)此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义PATH环境变量;

    (3)执行结果邮件发送给当前用户

============================================================
crontab语法格式

    crontab[-u user][-l | -e][-i][-s]

    -e:编辑任务;

    -l:列出所有任务;

    -r:移除所有任务;即删除/var/spool/cron/USERNAME文件

    -i:在使用-r选项移除所有任务时提示用户确认

    -u user:root用户可为指定用户管理cron任务

]# crontab -e:用户在使用此命令后会自动进入vim的编辑模式,让用户在其中编辑计划性任务,每个任务单独成行,编辑完任务以后wq保存退出即可

每项任务的格式都是有六个字段,这六个字段的意义为;

blob.png

时间表示法:

(1)特定值;

给定时间点有效取值范围内的值;

注意:day of week和day of month一般不同时使用;

(2)*

给定时间点上有效取值范围内的所有值;表示“每..”

blob.png

(3)离散取值:,

在时间点上用于逗号分割的多个值

#,#,#

blob.png

(4)连续取值-

时间点上使用-连接开头和结束

#-#

blob.png

(5)在指定时间点上,定义步长;

/#:#即步长

blob.png

注意:

(1)指定的时间点不能被步长整除时,其意义将不复存在;

(2)最小时间单位为"分钟",想完成"秒"级任务,得需要额外借助于其他机制;比如;定义成每分钟任务:而后利用脚本实现在每分钟之内(sellp命令),循环执行多次;


常用时间格式:及一些示例

blob.pngblob.png


特殊用法;

SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root 
HOME=/
# run-parts 
01 * * * * root run-parts /etc/cron.hourly 
02 4 * * * root run-parts /etc/cron.daily 
22 4 * * 0 root run-parts /etc/cron.weekly 
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置 cron 任务运行环境的变量:

SHELL 变量的值指定shell 环境(此处默认为 bash shell);PATH 变量定义用来执行命令的程序路径;cron 任务的输出被邮寄给 MAILTO 变量定义的用户名,如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出;HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 脚本来执行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地按照预设时间在每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本,并且具有可执行权限(chmod +x filename)。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

常见cron示例参考

5  * * * * ls 指定每小时的第5分钟执行一次ls命令 
30 5 * * * ls 指定每天的 5:30 执行ls命令 
30 7 8 * * ls 指定每月8号的7:30分执行ls命令 
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令 
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。] 
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段] 
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段] 
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ] 
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件 
50 7 * *  * root run-parts  /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件

第10、20、30分钟输出到/tmp/cron1.txt:
10,20,30 * * * * echo "第10、20、30分钟输出一次" >> /tmp/cron1.txt

以用户lzw.me的身份每两小时就运行某个程序:

0 */2 * * * lzw.me /usr/bin/somecommand >> /dev/null 2>&1


一些注意事项

    运行结果以邮件通知给当前用户;如果拒绝结束邮件;

    (1)command > /dev/null

    (2)command &> /dev/null

    定义COMMAND时,如果命令需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可;


anacron系统:

    假设计算机没有一直开机,之前在开机状态定义的计划性任务就没办法执行,这一情况对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要,对偶尔要关机的服务器很有用。

anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的计划任务。其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的计划任务在, 就执行该计划任务,执行完毕或无须执行任何计划任务时,anacron 就停止了。

由于 anacron 默认会以一天、七天、一个月为期去检测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有帮助。举例来说crontab 大多在每天的凌晨以及周日的早上进行各项任务, 偏偏你又关机了,此时系统很多 crontab的任务就无法进行。 anacron 刚好可以解决这个问题!

那么anacron又是怎么知道我们的系统啥时关机的呢?这就得要使用anacron读取的时间记录文件(timestamps)了!

anacron会去分析现在的时间与时间记录文件所记载的上次执行anacron的时间,两者比较后若发现有差异,那就是在某些时刻没有进行crontab啰!此时anacron就会开始执行未进行的 crontab 任务了

anacron的配置文件: /etc/anacrontab,负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。

/etc/cron.hourly/由/cron.d/0hourly执行,简单来就是,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓

回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一

周,那么一开机后的数个小时内,该工作就会主动的被执行喔!这就是/etc/anacrontab的定义



练习作业

1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“ etc-yyyy-mm-dd-HH.tar.xz”

0 */4 * * *  /bin/tar zvf /etc/ /backup/etc`date +%F-%H-%M`.tar.xz

2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名如“ messages-yyyymmdd”

0 23 * * 2,4,7 /usr/bin/cp -a /var/log/messages /logs/messages-`date +%F`

3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中

0 */2 * * * /usr/bin/cat /proc/meminfo |grep "^[S|M]" >> /tmp/meminfo.txt

4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报

#!/bin/bash
#
#
disk=`df |grep "/dev/sd" |tr -s ' ' "%" |cut -d% -f5 |sort -nr |head -n1`
if [ $disk -gt 20 ];then
        wall "disk is max 20%"
        exit 1
fi
先编写以上脚本
0 */4 * * 1-5 /root/scripts/crontab_diskcheck.sh 然后执行crontab -e 编辑如此命令

原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/44669