自学Linux Shell15.2-做业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

点击返回 自学Linux命令行与Shell脚本之路html

15.1-做业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

1  控制做业

1.1查看做业 (jobs命令)

jobs命令能够查看shell处理的当前做业。
jobs命令的参数:
算法

  • -l 列出进程的PID及做业号
  • -n 只列出上次shell发出的通知后改变了状态的做业
  • -p 只列出做业的PID
  • -r 只列出运行中的做业
  • -s 只列出已中止的做业

以上解析:shell

脚本使用$$变量显示Linux系统分配给脚本的PID,而后进入循环,每次迭代间隔5秒。经过命令行节目启动第一个脚本,而后使用Ctrl+Z组合键中止它。
使用&符号之后台进程方式启动另外一个做业,并将该脚本的输出重定向到一个文件,以便不会在监视器上显示。
做业启动以后,使用jobs命令查看分配给shell的做业。jobs命令便可以显示中止的做业也能够显示做业状态,还包括做业编号以及做业中使用的命令。

jobs输出中输出中的加号和减号
缓存

  • 带有加号的做业被视为默认做业。若是命令行没有指定做业编号,则它应该是任何做业控制命令引用的做业。
  • 带有减号的做业实在处理完当前默认做业以后将成为默认做业的做业。
  • 某一时间点,只能有一个带有加号的做业,也只能有一个带有减号的做业,不管shell中运行了多少做业。

2.重启中止的做业 (bg命令)

在bash做业控制下,可以之后台进程或前台进程的形式从新启动任何中止的做业。前台进程将控制正在处理的终端,所以谨慎使用特性。
要之后台模式从新启动做业,可使用带有做业编号的bg命令。
bg命令格式:bg 做业编号bash

 

之后台模式从新启动做业,出现命令行界面提示符,可以继续处理其余命令。
要之前台模式从新启动,可使用带有做业编号的fg命令:fg 做业编号服务器

 

2  调度优先级做业

在多任务操做系统中,内核负责为系统中运行的每一个进程分配CPU时间。实际上,CPU中一次只能运行一个进程,所以内核轮流向每一个进程分配CPU时间网络

默认状况下,从shell启动的全部进程在Linux系统上的调度优先级都相同。调度优先级是内核相对其余进程分配个某一个进程的CPU时间量。ide

调度优先级是一个整数值,从-20(最高优先级)到+20(最低优先级)。默认状况下,bash shell启动全部优先级为0的进程。这代表只须要一点处理时间的简单脚本与须要运行几个小时的复杂数学算法获得的CPU时间段相同。工具

有时须要更改特定命令的优先级,可能要下降优先级以减小它占用的CPU资源,还可能要提升优先级,以得到更多的处理时间。url

2.1 nice命令

nice命令可在启动命令时设置它的调度优先级

  • 要让命令在更低的优先级下运行,只须要使用nice -n命令行选项指定一个新的优先级水平
  • 必须将nice命令和要启动命令放置于同一行
  • nice命令阻止普通系统用户来提升命令的优先级
  • 也能够经过 nice 破折号后面跟上优先级 设定

 

2.2 renice命令

renice命令能够更改已经在系统中运行的命令优先级。它可以指定运行进程的PID以更改优先级

renice命令自动更新运行程序的调度优先级。renice命令有以下几个限制:

  • 只能对拥有的进程使用renice命令
  • 只能使用renice命令将进程调至更低的优先级
  • 根用户可使用renice命令将任何进程调至任何优先级。
  • 若是要彻底控制运行进程,则须要以根用户登陆。

3  定时运行做业

在处理脚本时,总会遇到须要在给定时间运行脚本。Linux系统提供3中方式在预约时间运行脚本:at命令、batch命令、cron表格。每种方法使用不一样的技术调度运行脚本的时间和频率。

3.1 at命令来计划执行命令

at命令容许指定Linux系统运行脚本的时间。at命令将做业提交到一个队列,并指示shell在什么时候运行该做业。另外一个命令atd之后台模式运行,并检查做业队列以运行做业。大部分Linux发行版均可以在启动时自动启动该特性。
atd命令检查系统上的特殊目录,以便运行使用at命令提交的做业。默认状况下,atd命令每隔60秒检查一次该目录。若是存在做业,atd命令检查运行做业的时间。若是时间与当前时间匹配,则atd命令将运行该做业。

3.1.1  at命令格式   at [-f filename] time
默认状况下,at命令将STDIN的输入提交到队列。可使用-f参数指定用于读取命令的的文件名(脚本参数)。
time参数指定Linux系统运行做业的时间。at命令能够识别各类时间格式

  • 标准的小时和分钟格式,好比10:15
  • AM/PM指示符,好比10:15PM
  • 具体指定的时间,好比now、noon、midnight、teatime(4PM)

除了指定运行做业的时间以外,还能够包括具体的日期,可使用各类格式的日期

  • 标准的日期格式,好比:MMDDYY、MM/DD/YY、DD.MM.YY
  • 文本日期格式,好比Jul四、Dec 25,没有年份也能够
  • 还能够指定时间增量:Now +25 minutes、10:15PM tomorrow、10:15 +7days

使用at命令时,做业将提交到做业队列中。
做业队列保存at命令提交的做业以便处理。有26种不一样的做业对垒可用于不一样的优先级水平。使用小写字母a到z引用做业队列。
默认状况下,全部的at做业都提交到做业队列a,即优先级最高的队列。若是但愿以较低的优先级运行做业,则可使用-q参数指定字母。

参数:

  • -V : 印出版本编号 
  • -q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者能够同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个 
  • -m : 即便程序/指令执行完成后没有输出结果, 也要寄封信给使用者 
  • -f file : 读入预先写好的命令档。使用者不必定要使用交谈模式来输入,能够先将全部的指定先写入档案后再一次读入 网络应用
  • -l : 列出全部的指定 (使用者也能够直接使用 atq 而不用 at -l) 
  • -d : 删除指定 (使用者也能够直接使用 atrm 而不用 at -d) 
  • -v : 列出全部已经完成但还没有删除的指定 

3.1.2 获取做业输出

做业在Linux系统运行时,没有与该做业关联的监视器。Linux使用提交做业的用户的电子邮箱地址做为STDOUT和STDERR。任何以STDOUT和STDERR为目的的输出都将经过邮件系统发送给用户。
若是系统没有安装at、mail命令使用命令:sudoapt-get install at、sudo apt-get install mail。进行安装。

 

 

 3.1.3 列出等待的做业 (atq 后者at -l)

 参看系统哪些做业在等待。 显示做业号、系统运行该做业的日期和时间以及所在的做业队列。

 3.1.4 删除做业(atrm 后者at -d)

 

3.2  按期执行做业命令

Linux系统使用cron程序调度需按期运行的job。corn程序在后台运行,它从特殊表格(corn表格)中查找须要调度运行的做业。

3.2.1 cron表格

cron表格使用特殊格式指定做业运行时间。cron表格的格式以下:

         min  hour  dayofmonth  month  dayofweek  command

cron表格能够将条目指定为具体的值、必定范围的值(如 1-5)或通配符(*)。例如,若是但愿天天10:15运行命令,可使用如下corn表格项:15 10 * * * command。

dayofweek项能够是3字符的文本值(mon、tue、wed、thu、fri、sat、sun),也能够是数字:0标识星期天,6表示星期六。

dayofmonth项指定每月的日期值(1-31)

PS:
由于每月份不一样,因此如何设置一个命令在每月的最后一天执行呢?
一种经常使用的方法是添加:if-then语句,该语句使用date命令检查明天是不是1号:

         00 12 * * * if [ `date +%d -d tomorrow` =01  ] ;  then ; command

经过if判断明天是否为01,若是是则执行命令。这将在天天的12点查看本日是不是该月的最后一天,若是是,它将运行命令。

命令列表必须制定要运行的命令或shell脚本的完整路径名。能够根据须要添加任何命令行参数或者重定向符号。  

cron程序使用提交做业的用户帐户运行脚本。所以必须拥有相应的权限才能访问命令行列表中的指定的命令和输出文件。

3.2.2  构建cron时间表

每一个系统用户均可以拥有本身的cron表格以及运行安排好的做业。Linux提供crontab命令处理cron表格。

  • -e:编辑该用户的计时器设置;
  • -l:列出该用户的计时器设置;
  • -r:删除该用户的计时器设置;
  • -u<用户名称>:指定要设定计时器的用户名称。

Linux下的任务调度分为两类:系统任务调度用户任务调度

系统任务调度:系统周期性所要执行的工做,好比写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

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

  •    第一行SHELL变量指定了系统要使用哪一个shell,这里是bash
  •    第二行PATH变量指定了系统执行命令的路径
  •   第三行MAILTO变量指定了crond的任务执行信息将经过电子邮件发送给root用户,若是MAILTO变量的值为空,则表示不发送任务执行信息给用户
  •   第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

用户任务调度:用户按期要执行的工做,好比用户数据备份、定时邮件提醒等。用户可使用 crontab 工具来定制本身的计划任务。全部用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件以下:

1 /etc/cron.deny     该文件中所列用户不容许使用crontab命令
2 /etc/cron.allow    该文件中所列用户容许使用crontab命令
3 /var/spool/cron/   全部用户crontab文件存放的目录,以用户名命名

crontab文件的含义:用户所创建的crontab文件中,也就是cron表格。(从新介绍一下)
每一行都表明一项任务,每行的每一个字段表明一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式以下:

1 minute   hour   day   month   week   command     顺序:分 时 日 月 周

其中:

  • minute: 表示分钟,能够是从0到59之间的任何整数。
  • hour:表示小时,能够是从0到23之间的任何整数。
  • day:表示日期,能够是从1到31之间的任何整数。
  • month:表示月份,能够是从1到12之间的任何整数。
  • week:表示星期几,能够是从0到7之间的任何整数,这里的0或7表明星期日。
  • command:要执行的命令,能够是系统命令,也能够是本身编写的脚本文件。

在以上各个字段中,还可使用如下特殊字符:

  • 星号(*):表明全部可能的值,例如month字段若是是星号,则表示在知足其它字段的制约条件后每个月都执行该命令操做。
  • 逗号(,):能够用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):能够用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):能够用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线能够和星号一块儿使用,例如*/10,若是用在minute字段,表示每十分钟执行一次。

每1分钟执行一次command

1 * * * * * command

 每小时的第3和第15分钟执行

1 3,15 * * * * command

在上午8点到11点的第3和第15分钟执行

1 3,15 8-11 * * * command

每隔两天的上午8点到11点的第3和第15分钟执行

1 3,15 8-11 */2 * * command

每一个星期一的上午8点到11点的第3和第15分钟执行

1 3,15 8-11 * * 1 command

每晚的21:30重启smb 

1 30 21 * * * /etc/init.d/smb restart
每个月一、十、22日的4 : 45重启smb 
1 45 4 1,10,22 * * /etc/init.d/smb restart
每周6、周日的1:10重启smb
1 10 1 * * 6,0 /etc/init.d/smb restart
天天18 : 00至23 : 00之间每隔30分钟重启smb 
1 0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11:00 pm重启smb 
1 0 23 * * 6 /etc/init.d/smb restart
每一小时重启smb 
1 * */1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb
1 * 23-7/1 * * * /etc/init.d/smb restart
每个月的4号与每周一到周三的11点重启smb 
1 0 11 4 * mon-wed /etc/init.d/smb restart
一月一号的4点重启smb
1 0 4 1 jan * /etc/init.d/smb restart

3.2.3  浏览cron目录

有4个基本目录 hourly、daily、monthly、weekly

若是须要脚本天天运行1次,只要将脚本复制到daily目录,cron就会天天执行一次。

3.2.4 anacron程序

使用cron程序存在的惟一一个问题是,它假定Linux系统天天运行24小时,每周运行7天。只有在服务器环境中运行Linux时才能发生这种状况。

若是在使用cron程序调度做业时Linux系统处于关闭状态,则做业将没法运行。cron程序没法再系统打开后从新运行错过的做业。

anacron程序使用时间戳肯定调度的做业是否在正确的时间间隔运行。若是它肯定某个做业错过了调度的运行时间,它将自动尽快的运行该做业。

该特性对于执行日志维护的脚本很是有用。若是系统在应该运行脚本时老是关机,则日志文件将得不到清理,文件大小可能会不断增大。使用anacron能够保证日志文件至少在每次系统启动的时清理一次。

anacron程序使用本身的表格(一般位于/etc/anacrontab)指定做业。在大部分Linux发行版本,该表格仅供根用户使用。

anacron表格的格式:period delay identifiercommand

  • period项定义做业应该间隔多久运行一次,一天为单位。
  • delay项指定在anacron程序肯定应该运行一个命令以后须要多长时间才会实际运行该命令。该选项能够为不一样的命令设置不一样的延时,以防止全部命令在一打开Linux系统时运行。
  • command条目包含了run-parts程序和一个cron脚本目录名。
  • identifier项是一个惟一的非空字符串,能够惟一地标识日志消息和错误电子邮件中的做业。
  • anacron不会运行位于/etc/cron.hourly的脚本,这是由于不会去处理执行时间需求小于一条的脚本。
相关文章
相关标签/搜索