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 只列出已停止的作业
以上解析:
脚本使用$$变量显示Linux系统分配给脚本的PID,然后进入循环,每次迭代间隔5秒。通过命令行节目启动第一个脚本,然后使用Ctrl+Z组合键停止它。
使用&符号以后台进程方式启动另一个作业,并将该脚本的输出重定向到一个文件,以便不会在监视器上显示。
作业启动之后,使用jobs命令查看分配给shell的作业。jobs命令即可以显示停止的作业也可以显示作业状态,还包括作业编号以及作业中使用的命令。
jobs输出中输出中的加号和减号。
- 带有加号的作业被视为默认作业。如果命令行没有指定作业编号,则它应该是任何作业控制命令引用的作业。
- 带有减号的作业实在处理完当前默认作业之后将成为默认作业的作业。
- 某一时间点,只能有一个带有加号的作业,也只能有一个带有减号的作业,无论shell中运行了多少作业。
2.重启停止的作业 (bg命令)
在bash作业控制下,能够以后台进程或前台进程的形式重新启动任何停止的作业。前台进程将控制正在处理的终端,因此谨慎使用特性。
要以后台模式重新启动作业,可以使用带有作业编号的bg命令。
bg命令格式:bg 作业编号
以后台模式重新启动作业,出现命令行界面提示符,能够继续处理其他命令。
要以前台模式重新启动,可以使用带有作业编号的fg命令:fg 作业编号。
2 调度优先级作业
在多任务操作系统中,内核负责为系统中运行的每个进程分配CPU时间。实际上,CPU中一次只能运行一个进程,因此内核轮流向每个进程分配CPU时间。
默认情况下,从shell启动的所有进程在Linux系统上的调度优先级都相同。调度优先级是内核相对其他进程分配个某一个进程的CPU时间量。
调度优先级是一个整数值,从-20(最高优先级)到+20(最低优先级)。默认情况下,bash shell启动所有优先级为0的进程。这表明只需要一点处理时间的简单脚本与需要运行几个小时的复杂数学算法得到的CPU时间段相同。
有时需要更改特定命令的优先级,可能要降低优先级以减少它占用的CPU资源,还可能要提高优先级,以获得更多的处理时间。
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
- 文本日期格式,比如Jul4、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
每月1、10、22日的4 : 45重启smb
1 45 4 1,10,22 * * /etc/init.d/smb restart
每周六、周日的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的脚本,这是因为不会去处理执行时间需求小于一条的脚本。