00

的运行控制

我们早已晓得怎样启动shell,而且脚本一旦“启动”,我们怎样对脚本进行运行控制了?例如,怎么暂停、停止、继续运行一个进程;通过本文的介绍,答案将一一出炉。

01

讯号处理机制

Linux通过讯号实现进程间的通讯。编程用户可以借助那些不同的讯号,响应执行不同的,实现对shell脚本的控制运行。

1.1重要的Linux讯号

下表列举了LinuxShell编程中可能会碰到的最常见的讯号。

讯号值

助记符

描述

SIGHUP

挂起进程

SIGINT

中止进程

SIGQUIT

停止进程

SIGKILL

无条件中止进程

15

SIGTERM

可能的化中止常常

17

SIGSTOP

无条件停止进程,但不是中止进程

18

SIGTSTP

停止或暂停进程,但不中止进程

19

SIGCONT

继续运行停止的进程

shell会将这种讯号传给shell脚本程序来处理,而shell脚本的默认行为是忽视那些讯号,要防止这些情况,我们可以在脚本中加入辨识讯号和处理讯号的。

1.2形成讯号

bashshell支持借助按键组合键生成两种基本的Linux讯号,用于中止和暂停进程:

1.3捕捉讯号

讯号形成之后,我们可以忽视讯号什么是linux,也可以借助Linux提供的trap捕捉讯号并执行相应的响应命令。

格式:trapcommandssignals

在上述的命令格式中,signals是一组用空格分开的须要捕捉的讯号;commands是捕捉到相应讯号后想要执行的shell命令。示例如下:

linux执行.sql脚本_linux定时执行php脚本_linux at 执行脚本

1.4捕捉脚本的退出

格式:trapcommandsEXIT

在上述的命令格式中,当shell脚本正常或异常退出,均可触发执行commands命令。这是在shell完成任务时执行命令的最简易的方式。如下示例示范了shell正常运行与提早退出,均执行了特定命令:

linux定时执行php脚本_linux执行.sql脚本_linux at 执行脚本

1.5移除讯号捕捉

linux定时执行php脚本_linux at 执行脚本_linux执行.sql脚本

格式:trap-singal

在上述格式中,trap命令后跟随一个单破折线,之后是要移除的讯号,将其恢复到正常状态;一旦讯号捕捉被移不仅,脚本会忽视该讯号。并且,假如在捕捉被移除前收到讯号,脚本都会在trap命令中处理它。

02

后台运行脚本

在脚本在终端启动后,会仍然占用运行脚本的终端。假如脚本运行时间很长,这么该终端都会仍然被占用。Linux系统提供了脚本后台运行模式;该该模式中,进程运行时不会和终端会话上的STDIN、STDOUT和STDERR关联,容许它们在后台运行而不用占用终端会话。

(1)格式:command&

以后台模式运行shell脚本,只须要在命令后加个&符即可。

linux at 执行脚本_linux执行.sql脚本_linux定时执行php脚本

如上所示,以后台模式运行脚本后,输出的第一行信息为[1]634;方括弧中的数字是shell分配给后台进程的作业号;第二个数是Linux系统分配给进程的进程ID(PID)。据悉,当后台进程在运行时,依然会使用终端显示器来显示STDOUT和STDERR消息。

注意:每位后台进程就会与运行进程的终端会话相绑定;假如显示终端退出了,这么该后台进程也会退出。

(2)格式:nohupcommand&

nouhup命令运行了另外一个命令来阻断所有发送给进程的SIGHUP讯号。这会在退出终端会话时制止进程退出。上述命令格式与普通后台进程最重要的区别在于:后者虽然终端会话退出了,进程依旧会继续执行直至完成。

因为nohup命令会从终端解除进程的关联,进程会扔掉STDOUT和STDERR的链接。为了保存该命令的输出,nohup命令会手动将STDOUT和STDERR的消息重定向到一个名外nohup.out的文件。

注意:当在同目录下同时运行多个nohup命令时,这种所有运行的命令输出会全部追加到同一个nohup.out文件中。

03

作业控制

后面我们介绍到可以通过组合键来停止shell中正在运行的作业;在作业停止后,我们可以中止或重启它。启动、停止、无条件中止以及恢复作业的这种功能也称为作业控制。通过作业控制,我们能够完全控制shell中正在运行的所有作业。

3.1查看作业

格式:jobs[option][jobID]

jobs命令可以查看shell当前正在处理的作业。

linux at 执行脚本_linux定时执行php脚本_linux执行.sql脚本

从前面的执行事例中,我们可以发觉结果输出中有+和-;带减号的作业会被当作默认的作业。在使用作业命令的时侯,倘若未在命令行指定任何作业号,控制控制的对象均为默认的作业。任何时侯都只会有一个带+的作业和一个带-的作业;当默认作业完成处理时,带-的作业会成为下一个默认作业。

3.2重启停止的作业

在bash作业控制中,我们可以将已停止的作业作为后台进程或前台进程重启;重启后的前台进程会接管当前工作的终端。

格式:bg[jobID]

上述命令才能实现以后台模式重启一个作业。而且,因为作业是以后台模式重启的,命令行界面的提示符会出现,容许输入其他命令。

格式:fg[jobID]

上述命令才能实现先前台模式重启一个作业。而且,因为作业是先前台模式重启的,命令行界面的提示符不会出现,直至该作业运行完成。

04

调整运行优先级

现代操作系统基本都是采用时间片轮转的方式调度进程;而在时间片抵达的时侯,优先调用进程等待队列中优先级高进程;在Linux操作系统中,调度优先级是一个从-20(最低优先级)~+19(最高优先级)的整数值,也就是整数值越小,进程的调度优先级就越高。默认情况下,bashshell以优先级0来启动所有进程。

4.1nice命令

格式:nice-npricommand

nice命令可以实现命令启动时调整一个命令的调度优先级;-n选项容许以更低的优先级运行命令;假如想要降低运行命令的优先级,系统会报错。

4.2renice命令

格式:renicepri-ppid

renice命令可以改变已启动运行的进程的优先级;使用该命令须要注意以下事项:

05

定时运行作业

定时运行作业在好多业务场景都有应用。Linux系统提供了多个在预定时间运行脚本的方式:at命令和cron表。

5.1at命令

格式:at[-ffilename]time

该命令中用-f参数来指定读取命令(脚本文件)的文件名。time参数指定了Linux系统何时运行该作业,具体的时间格式有:

5.2cron表

at命令常用于在预定时间执行脚本;假如须要脚本根据一定时间频度重复执行命令则推荐使用cron时间表。

cron时间表的格式如下:

格式:minhourdayofmonthmonthdayofweekcommand

cron时间表容许你使用特定值、值范围或则是转义(*)来指定条目。min、hour分别用于设置分钟、小时;我们可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0为假期,6为周日)来指定dayofweek条目。

示例:

1510***command表示在每晚10:15运行命令

15101**command表示在每月的第三天10:15运行命令

格式:crontaboption

option为命令选项,解释如下:

-e:实现对cron时间表进行编辑

-l:显示已有的时间表

cron程序是假设Linux系统7x24小时运行的。若果在cron时间表中的作业计划运行时间内Linux系统被关掉,那作业就不会运行了。当系统开机时,cron程序不会回来再运行这些错过的作业。anacron程序可以有效解决那些问题。

anacron会尽早运行错过了计划的作业。anacron程序只会处理坐落cron目录的程序,例如/etc/cron.monthly。它用时间戳来决定作业何时被运行。每位cron目录都有个时间戳,坐落/var/spool/anacron。

anacron时间表的格式如下:

格式:perioddelayidentifiercommand

其中,period定义了作业多久运行一次,以天为单位;delay条目指定系统启动后多少分钟后anacron程序开始运行错过的脚本;identifier是一个非空白字符串,如cron.weekly,用于惟一标示日志消息。

注意:anacron不会运行坐落/etc/cron.hourly的脚本,这是由于anacron程序不会处理执行时间需求大于三天的脚本。

06

开机运行脚本

Linux支持当系统开机时或用户刚启动一个新的bashshell会话时启动命令。

不同的Linux发行版提供了不同的开机运行文件,我们可以将一些命令写入开机运行文件,实现当系统开机时手动运行那些命令。

每位用户的主目录下都有两个文件,bashshell会用它们来自启动脚本并设置环境变量:

当新shell是新的登陆生成的话,bashshell会运行.bash_profile文件。可以把任何登陆时要运行的脚本装入该文件。

当新shell启动时,包括有新的登陆的情况,bashshell会运行.bashrc文件。

假如我们想为系统中的所有用户运行一个脚本,我们可以在/etc/bashrc文件中加入要运行的脚本。

注意:以上脚本命令需编撰完整路径。

07

小结

综上,本文对shell的运行控制若干技术进行了介绍。

Linux系统通过对shell脚本发送讯号实现对脚本的运行控制。shell脚本才能接受外部讯号从而实现中止、暂停一个正在运行的进程;并可以通过trap句子来捕捉讯号并执行自定义的特定命令。

我们可以通过在执行的命令后添加一个&符号来让脚本或命令以后台模式运行;以后台模式运行命令或脚本时,交互式shell会返回,容许用户在控制台终端继续输入其他命令;后台运行的命令会绑定到该终端会话linux关机命令,假如退出了终端会话,后台进程也会随后中止。

Linux提供了nohup命令,可以制止上述情况发生。该命令能拦截任何能停止shell命令的讯号。这样,虽然早已退出了运行该shell命令的会话终端,shell仍会继续执行。

Linux提供了强悍的作业控制能力。jobs命令可以查看该shell会话启动的进程。对于早已停止的作业,借助bg命令可以以后台模式重启一个作业;要曾经台模式重启作业linux at 执行脚本,则需使用fg命令。nice命令和renice命令准许你调整进程的优先级。通过增加进程的优先级,可以让CPU给该进程分配更少的时间。

不仅还能对进程进行运行控制外,还可以对shell脚本何时启动进行设定;其中,at命令准许你在预设时间运行脚本;cron程序则提供了周期性运行脚本的插口。

最后,Linux提供了在系统开机或用户启动新bashshell时运行自定义脚本的机制。各个Linux发行版提供了不同的文件插口在系统每次开机时,容许运行用户自定义脚本;据悉,用户家目录下的.bas_profile文件会在用户每次登入到系统时运行脚本;.basrc文件会在启动每位shell实例时运行脚本。

在下文中,我们将会进阶到Linuxshell的函数编程。敬请期盼!

OneMoreThing

推荐1:

上文1:

上文2:

近日,我和活跃在业界的一线技术老司机们共同开通了知识星球,——一个与公众号有别,但又一脉相承的技术圈、认知圈:公众号会一如既往地进行知识分享,知识星球则坚持关注解决问题与动手实践,主要涉及Java前端、Linux、Python、Android等技术领域,问题很广、方法好多、思绪很快,希望我们能否在这儿伫足思索、交流、沉淀、提升。

你负责认真,我们负责帮你解决问题,让改变发生;欢迎你们扫码加入我们的星球。期盼2018,在程序猿成长的公路上linux at 执行脚本,共同进化!

本文原创地址://gulass.cn/ljbdyxkzyxjc.html编辑:刘遄,审核员:暂无