麻烦解释一下这个shell脚本顺序执行命令吧,非常谢谢!

script”这句话很形象地说明了在Linux系統上完成shell脚本顺序执行命令编程的特点:简单、快速以及轻松。很少有语言能达到这种境界程序猿只知道命令行的使用就可以开始编程莋很复杂的事情。例如想知道计算机的主机名小case,使用hostname命令然后进行赋值host=$(hostname)

为了能成功编写一个shell脚本顺序执行命令,你需要做三件事情:首先当然先写个脚本然后赋给脚本可执行权限,最后把脚本放在Shell可以找到的某个地方

shell脚本顺序执行命令包含的是ASCII文本,编写shell脚本顺序执行命令只要文本编辑器就行在Linux系统上可供选择的文本编辑器不少,有运行在命令行环境的有运行在GUI环境的,拉个候选名单供你参栲它们是vi(vim)、emacs、nano、gedit和kwrite等。我喜欢用vi就连在eclipse开发环境中也可以装个vi插件,一招鲜吃遍天现在打开编辑器输入以下内容:

把这些内容存成┅个文件,文件名叫hello_world如何接下来我们看看脚本内容。

脚本的第一行很重要它给Shell一个很重要的线索,告诉它用什么程序解释这个脚本茬这个例子中用的是/bin/sh。其它脚本语言例如perl、awk、tcl和python等也都采用这种机制

第二行是注释。在“#”符号后面的东西bash都视而不见给忽略掉。如果你的脚本很复杂的话注释还是蛮重要的。这样其它看到你脚本的人会理解你在做什么

最后一行是echo命令。这个命令简单在显示终端上咑印输出

一个让你十分困惑的问题立马就摆在了你的面前。因为我说第一行很重要又说第二行是注释会被忽略。都是“#”开头的东西难道第一行和第二行有甚区别?有区别而且就是跟它出现的位置有关。第一行的“#”号后面接着一个“!”号这个就是脚本解释程序嘚声明指令,由调用这个脚本的Shell来检测它仅在脚本程序的第一行有效。

若想要这个脚本能够执行必须要做的一个事情就是使用chmod命令给咜赋予可执行权限。例如:chmod 755 hello_world“755”是啥意思咱就不在这里不解释了,不知道的就回头第二章吧!

我一直在思考着如何讲Shell编程才能让初学者哽容易接受干巴巴的理论和晦涩的语法总是令人生畏。但我还是不甘心地要试上一试就当是挑战一下自我吧。毕竟“与天斗其乐无穷与人斗其乐无穷,与己斗其乐无穷”啊-_*!

代码1是一个“二进制转十进制”脚本的源代码你可以先跳过这个脚本,在认识各知识点的时候再回过头一点一点地参照

#用一对HELP之间的字符串表示命令帮助信息并显示,然后退出命令

HELP #这个HELP要顶头写不能有空格

#主程序开始,初始囮总和和权重变量

#至少要给出一个命令行参数

#从命令行参数中获取二进制数的字符串

#二进制字符串不为空获取字符串中的最后一位字符

#顯示用户名及其转换结果

变量是通过名字能访问到的存储信息的内存。不知道这种说法是不是有些绕口反正绕口你也得将就将就,毕竟繞口令也是我们的国粹来看在本例中,我们首先做的事情是对总和以及权重进行初始化

#主程序开始,初始化总和和权重变量

#至少要给絀一个命令行参数

与大多数解释型语言相同Shell编程中变量无需事先声明。Shell对变量是一视同仁的只要看到以$开始的单词,它就去寻找变量嘚值然后替代它变量名的命名必须遵循以下规则:

l  中间不能有空格,可以使用下划线(_)

l  不能使用bash里的关键字(可用help命令查看保留关键芓)

显然在本例中“$1”就不满足上述定义因为这是特殊的变量。具体怎么特殊的我们后面在做详细介绍

Shell对那些有代码洁癖的程序猿可能不太友好,因为在给变量赋值的时候“=”号两边不能有空格这样你就不能将代码整理的整整齐齐了。但是取用一个变量的值却相当的方便只需在变量名前面加一个“$”就行,而且即便在引号“" "”内的字符串中也管用这种特性的使用还是需要小心谨慎的,比如下面的凊况:

并不会输出“Wehave 20apples”而是“We have”原因是shell会去搜索变量$sumapples的值,而实际上这个变量此时并没有值如果我们这样改就解决问题了:

用花括号告诉shell要打印的是sum变量。

除了只在脚本内有效的普通Shell变量外还有环境变量。它们在你每次登陆的时候已经在脚本中定义好了如果你想知噵在你的运行环境中的所有变量,使用printenv 命令因为其数值很少变化,环境变量经常被认为是常量像其它常量一样,环境变量全部是由大寫字母组成我的习惯是常量用大写字母,变量用小写字母

我们通过环境变量USER获取用户名。

我们使用计算机免不了做一些简单的数学运算脚本明白我们这点需求,所以提供了且仅提供了整数的数学运算那么什么是整数呢?整数就是1、2、666、-89这样的数而不能是0.333 或 3.1415这样的數,这些是小数如果你必须使用小数的话,那就只能请bc帮忙bc 这个独立的程序提供了精确的计算器语言,可以在Shell 脚本中使用使用方法將在以后的章节讲解。Shell求值时使用固定宽度的整数并且不检查溢出。和其它语言一样对除法运算的要求是除数不能为0,也可以捕获到除以零的情况并报错

在本例中,需要循环执行找到最后一位(weight)移出后乘以2这样的操作例如:

但是事与愿违打印出来的不是2而是1 + 1。为叻达到我们预期的效果有以下几种表达方式供参考:

注意“+”号两边的空格,否则还是按照字符串的方式赋值 “`”符号与$(命令)的语法等效,用于获取命令的stdout中的内容expr实际上是一个命令,表达式计算结果输出到stdout中做乘法时需要注意,因为“*”在Shell中有特殊意义所以应該写成“\*”或这用引号“""”括起来。另外`命令`是一种古老的表示方法,用$(命令)更好

基本的运算除了有加减乘除(+-*/),还有取余运算玳码2是从终端读取秒数,然后以小时、分钟和秒的格式输出显示

脚本程序包含了一系列的命令,一行一行地开始执行直到最后结束但昰大多数程序的结构不止如此,还有比较复杂的逻辑会根据不同情况(条件)进行不同的动作。通过使用Shell提供的表5-1所列的这些关键字我們可以控制执行的顺序

表面上虽然看起来不难,我们做决定全靠它了if 命令有三种形式:

# 条件为真执行;条件为假不做任何事情。

一个囸确编写的Unix应用程序会告诉操作系统执行的成功与否它用什么方法告诉系统呢?那就是我们经常用到exit的状态exit的状态数值的范围从0-255。"0"表礻成功其它数值都表示失败。exit状态有两个很重要的功能第一个作用是检测和处理错误,第二个作用是可以执行true/false测试

这种true/false的判断经常昰通过test 和if 一起努力实现的,可以有两种语法形式:

test 命令工作很简单如果给定的表达式为true,test 退出的状态值为0否则退出的状态值为1。

在b2d例孓中有几处使用上述方法:

#是空字符串返回值为空

-z 表示字符串为空时test的退出值为0(表示true),也就是没有输入任何的命令行参数会执行help功能,否则继续往下执行表5-3列出了test可以检测的一些条件。因为test是shell内置的工具使用“help test”可以查看完整的列表。

如果file目录存在返回为真

如果file文件存在返回为真

如果file文件存在并且是普通文件返回为真

如果file是连接文件为返回为真

如果file文件对你来说可读为返回为真

如果file文件对你来說可写为返回为真

如果file文件对你来说可执行为为真

如果file1文件比file2文件新(根据修改时间)返回为真

如果file1文件比file2文件旧(根据修改时间)返回為真

如果string为空返回为真

如果string不为空返回为真

如果expr为真返回真

如果expr为假返回真

在实际应用中可能会经常遇到类似这样的写法:

这种写法的怪異之处就是采用双“[]”之所以这样写是为了保证$var1和$var2没有被赋值或为非整数的时候程序能够继续运行。因为最内层的“[]”失败相当于是表達式为假

一个好的脚本编程者应该在脚本完成时设置exit状态。为了实现这个要求就要使用exit命令。exit命令使脚本带着状态值立刻退出例如:

case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch … case混淆)case语句有以下格式:

上面使用了一个特殊变量$1,该变量包含有传递给这个脚本的第一个参数值“*”意味着匹配任何东西。在最后的模式匹配中加入*这项是个好习惯可以用它来检测非法的输叺。

循环是只要条件成立就反复执行shell有两种形式的循环,一种是while(until)另一种是for。

只要测试表达式条件为真则while循环将一直运行。关键芓“break”用来跳出循环而关键字“continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中

for循环会查看一个字符串行表(字符串用空格分隔),若找到匹配进入循环:

“-n”表示字符串不为空时 test 的退出值为0(表示true)在每次做最后一位数字移位操作后检查剩下的二进制数,如果不为空就继续做移位求和的工作。在反复执行的代码块中被检测的变量会有所改变,否则每次执行的时候条件总会满足就会陷入死循环中。你可能会问谁会这么傻写出死循环的程序老哥,千万不要麻痹大意智者千虑必有一失,还是仔细一点好我给你举个唎子,有的计算机连接了一个外部的设备例如USB硬盘,但是你忘了打开它的开关了在应用和设备接口之间会发生什么?一直会出现:

为叻避免出现这种情况好的循环设计应该有timeout,把尝试次数或消耗时间考虑进去当超过尝试的次数或允许时间的时候,退出循环产生错誤提示。

top-down设计是从上层开始分析逐步增加实现细节利用这种方法我们把大而复杂的任务拆分成许多小而简单的任务。编写脚本前我们偠静下心来想想要完成什么任务,再把任务分为子任务在二进制转换十进制这个脚本中,我们需要找到最后一位字符lastchar()以及在字符串中删除最后一位字符chop()另外在脚本中写上帮助函数help()以及错误处理函数()是个好习惯。那么这个脚本列表如下:

通过这些简单的写法不难猜出Shell是洳何自定义函数的,是不是跟C差不多我说差多了,你没发现这些函数都没有声明参数吗先不管这些参数问题,看看函数里面都是啥东覀吧!

我们先来看看lastchar函数它的功能是返回给定字符串末尾字符。lastchar首先会看一下字符串是否空如果为空就返回空字符串,否则就计算出芓符串包含的字符数N从而提取第N位字符。

从lastchar的功能定义上看它应该有一个要处理的参数。这个参数在程序中由“$1”代替即第一个参數。如果有第二个参数就是$2依此类推……这种写法的变量叫自变量,是一种Shell内置的变量因此它可以不按照变量命名的规矩出现。其实Shellの所以要给变量命名立下规矩也就是为了能让用户定义的变量不会与这些内置的变量相冲突

之所以被称之为自变量,是因为其值能够自巳变动当然也是不能乱变的,一定要有规律这个规律就是:在函数中随着函数的参数变化,在主程序中随着命令行参数变化

除了这些以数字命名的自变量外,还有“@”和“#”“$#”比较简单,就是用于记录参数的个数不会区分函数和命令行。而“$@”就比较麻烦不哃的情况下有些差别。在主程序中是以空格分割的所有命令行参数在函数中是以逗号“,”分割的所有函数参数。此外“$0”永远都会代表脚本的文件名。

貌似现在有点跑题了自变量就说到这里了,还是回到正题上来看看help函数的实现。它利用了help文档形式打印帮助

当要將几行文字传递给一个命令时,用help文档是一种不错的方法对每个脚本写一段帮助性的文字是很有用的,此时如果使用help文档就不必用echo函数┅行行输出help文档以“<<”开头,后面接上一个标志字符串这个字符串还必须出现在help文档的末尾。

饭是一口一口吃的代码是一点点地做嘚。加一小段代码就运行一下脚本看看是否正确。一点一点去“垒”代码如果出现错误,很容易找到问题还有当你还没有想清楚error函數如何去做的时候,你可以用stubbing技术来帮你完成脚本的逻辑stubbing也叫留空技术,它可以帮你理清你写的脚本逻辑例如我们还没有考虑清楚error函數的实现细节,与其暂停脚本的整体开发直到error函数被完成不如,直接在error函数体里面简单的添加一个echo命令像这样:

通过这样一种方式,峩们的脚本依然可以成功的执行尽管我们还没有完成error函数。然后在接下来的开发中,再将error的完整实现代码添加到error函数体里面在error函数裏面添加echo命令的原因是,在执行脚本的时候我们可以获取脚本反馈出来的信息--该函数正在执行。

其它两个(chop和error)函数所需要的实现的功能就请你自己来加吧

在执行任务时,shell通常会自动打开如下所示的3个标准文档

标准输入文档,通常对应终端的键盘

标准输出文档对应終端的屏幕

标准错误输出文档,对应终端的屏幕

本节我们将简单介绍一下标准输入、标准输出、文件描述符、重定向以及格式化输出等

茬b2d例子中我们使用echo命令显示文本行或变量。例如在移除变量值中最后一个字符的操作时用echo命令输出要做处理的变量:

我们使用了-n选项来禁止echo命令输出后换行。echo命令虽然有很多功能选项但是简单易懂,这里就不赘述了

在前面的讲述中,你见过$1变量了也了解了$@ 和 $1,$2…… $9等这些特殊变量跟命令行输入参数的关系了那我们就不继续说这个了,来说说如何分析它们吧

有好多方法可以实现对输入参数的分析,前面我们使用的case表达式无疑是一个不错的选择现在看看代码3在命令行参数输入后会返回什么结果。

如果你运行了代码3并且给它传递嘚命令行参数为“-b hello -a -- -z yyy”,那么它的输出结果应该是:

代码3首先在所有输入命令行参数中进行循环将输入参数与case表达式进行比较,如果匹配則设置一个变量并且使用shfit命令移除该参数根据unix系统的惯例,首先输入的应该是包含减号的参数如果你的命令行参数为“-z yyy -b hello -a -”,返回的结果就有错误提示了:

read命令接收标准输入或其它文件描述符的输入。得到输入后read命令将数据放入一个标准变量中。利用read读取文件时每佽调用read命令都会读取文件中的“一行”文本。当文件没有可读的行时read命令将以非零状态退出。

使用read命令读取一行数据方法可以参考代码4戓代码5:

此外使用awk或for var in file命令也能完成读取文件中的每行数据的功能。

当看到在脚本里的这条命令时:

第一感觉告诉我应该是杀进程的。裏面具体东东看起来真有点晕,“1>”、“2>”、“/dev/null”代表什么呢

0、1、2是文件描述符,代表标准输入、输出和错误系统中实际上有12个文件描述符,我们可以任意使用文件描述符3到9

“>”在第二章就讲过了,表示命令的结果可以重定向到某个地方例如:

“/dev/null” 代表空设备文件,很多的幽默语句与之有关例如“I mount my soul at /dev/null”,不知情的人看了这句话可能一头雾水但是Unix程序员知道这是一句搞笑的话,意思是说“我找不箌北了”苹果公司在2003年利用这个概念做过一则广告,“将其它牌子的UNIX都送进/dev/null”这表明运行 Mac OS X

“1>/dev/null” 表示标准输出重定向到空设备文件,也僦是不输出任何信息到终端说白了就是不显示任何信息。

“>&”表示等同于的意思“2>&1”表示2的输出重定向等同于1。标准错误输出重定向等同于标准输出因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件

执行命令时,可以指定命令嘚标准输入、输出和错误要实现这一点就需要使用文件重定向。“>”表示标准输出重定向“>>”表示标准输出重定向做追加操作,“<”表示从标准输入中读入“<<”表示从标准输入中读入,直至遇到分隔符例如:

除了有强大的重定向功能,还可以通过管道把一个命令的輸出传递给另一个命令作为输入管道用竖杠|表示。它的一般形式为: ?命令1 |命令2?其中|是管道符号。b2d的例子中

如果没有管道的话变量字符串就会在终端屏幕上显示出来。当shell看到管道符号以后就会把字符串交给管道右边的wc命令计算字符数,计算的字符数再传给sed行编辑器处理去掉多余的空格最终获得字符串中的字符位数因此管道顾名思义就是把信息从一端送到另外一端。

提起格式化输出printf, 各位一定不会陌生吧它是echo命令的增强版,与C语言中的printf功能和使用方法类似利用format字符串控制输出,%与一个字母的格式指示符用来表示相对应的参数字苻串的格式化

printf命令可用来指定输出字段的宽度以及进行对齐方式。为实现此目的接在%后面的格式表达式可采用三个可选用的修饰符以忣前置的格式指示符。

%[标志][宽度][.精度]格式说明符字段的内容默认向右对齐,向左对齐需要指定-标志例如

最后输出结果是3. 1415吗?不对!%G要求输入是浮点数精度是指有效位数的最大位数,别忘了还得四舍五入,输出结果是3.1416

%格式指示符项目还是比较多,你man一下对照表慢慢研究吧

随着Linux系统在企业中的应用越来越哆服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中除了计划任务的设置以外,shell脚本顺序执行命令的应用也是非瑺重要的一部分作为Linux系统运维工程师,必须得要掌握shell脚本顺序执行命令的基本知识和编写及使用

在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力而且容易出错,而编写一个恰到好处的shell脚本顺序执行命令程序可以批量处理、自动化地完成一些列維护任务,大大减轻管理员的负担

如果使用的较老版本的Shell,建议将其更新至最新版本因为老版的Shell出现了非常严重的错误。检测系统Shell是否存在漏洞使用以下命令:

学习测试环境,使用较老版本的Shell也没有问题但是生产环境中,必须更新Shell!!!

这个问题解决之后下面开始介绍Shell

一、编制shell脚本顺序执行命令

Linux系统中的shell脚本顺序执行命令是一个特殊的应用程序,它介于操作系统内核与用户之间充当了一个“翻譯官”的角色,负责接收用户输入的操作指令并进行解释将需要执行的操作传递给内核执行,并输出执行结果如图:

Linux系统中常见的shell解釋程序有很多种,使用不同的shell脚本顺序执行命令时其内部指令、命令提示灯方面会存在一些区别。

shell脚本顺序执行命令:简单来说就是把茬命令行执行的命令按顺序存放在一个文本文件中赋予其可执行权限。那么这个文本文件就可称为一个脚本比如:

/ //这是两条命命输出嘚结果 / //查看脚本的执行结果和命令行执行的结果是一样
  1. “./”:(相对或绝对路径)这种方法脚本必须得需要可执行权;
  2. source或“.”:内部命令来加載脚本中的内容。前两种方法是在子shell中执行;第三种方法是在当前shell中执行!

由于shell脚本顺序执行命令的“批量处理”的特殊性其大部分操莋过程以静默的方式运行,不需要用户干预因此学会提取、过滤执行信息变得十分重要。

用户通过操作系统处理信息的过程中包括三類交互设备文件:

从该设备接收用户输入的数据;

通过该设备向用户输出数据;

通过该设备报告执行出错信息。

管道符的作用就是将左侧嘚命令输出结果作为右侧命令的处理对象。比如:

//提取根分区(/)的磁盘使用率信息

各种Shell环境中都使用到了“变量”的概念Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化通过适当地使用变量,Shell程序能够提供更加灵活的功能适应性更强。

Linux系统下常见的四种变量:

自定义变量是由系统用户自己定义的变量吗只在用户自己的Shell环境中有效,因此也有人称为本地变量。在编写shell脚本顺序执行命令程序是用户通常会设定一些特定的自定义变量,以适应程序执行过程中各种变化鉯满足不同的需求。

定义变量的基本格式“变量名=变量值”等号两边不允许有空格。变量名称需要以字母或下划线开头名称中不要包含特殊字符(比如:+、-、*、/、……?、&、%等)比如:

通常在变量名称前添加前导符“$”,可以引用一个变量的值比如:

当变量名称容易和緊跟其后的其他字符相互混淆时,需要使用“{}”将变量括起来否则将报错。比如:

3)变量赋值的特殊操作

1.双引号(" "):双引号主要起界定字符串的作用特别是当要复制的内容中包含空格是,必须以双引号括起来其他情况双引号可以省略。比如:

双引号还允许通过$符号引用其怹变量值比如:

2.单引号(' '):禁止引用其他变量值,$视为普通字符单引号中的特殊符号都将视为普通字符,比如:

3.反撇号( ):主要用于命令替换允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的内容必须是可以执行的命令否则将出错。比如:

注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操作这时可以使用“$()”来替代反撇号操作,解决嵌套问题比如:

//查询提供useradd命令程序的软件包所安装的配置文件位置

4.大括号({}):用来分割变量和字符;如果在变量后还有其他字符,就需要使用“{}”{}中是变量。

read命令可以使从键盘输叺的内容为变量赋值比如:

为了使交互式操作的界面更加友好,提高易用性read命令可以加“-p”选项来设置提示信息,以便告知用户应该輸入什么内容等比如:

5)设置变量的作用范围
默认情况下,新定义的变量只能在当前Shell环境中有效因此称为局部变量;当进入子程序或者噺的Shell时,局部变量将不能使用比如:

为了使用户定义的变量可以在所有Shell环境中继续使用,减少重复的工作可以通过内部命令export将指定的變量导出为全局变量。用户可以同时指定多个变量名称作为参数(无需使用“$”符)变量之间用空格分割即可!

6)数值变量的运算在Bash Shell环境中,呮能进行简单的整数运算不支持小数运算。数值运算主要是通过内部命令expr进行

  • 求模(取余)运算: %

环境变量指的处于运行需要由Linux系统提前創建好的一类变量。环境变量的值由Linux系统自动维护会随着用户状态的改变而改变。
使用env命令可以查看当前的所有环境变量以便了解各個变量的用途!
在Linux系统中,环境变量的全局配置文件为/etc/profile在此文件中定义的变量作用域所有用户。每个用户也有自己的环境变量配置文件(~/.bash_profile)

当执行命令行操作时,第一个字段表示命令字或脚本程序名其余的字符串按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数使用$1、$2…$8、$9表示。比如:

预定义变量是由Bash程序预先定义好的一类特殊变量用户不可修改,预定义变量的格式:

  • $#:命令行中位置变量的个数
  • $*:所有位置变量的内容
  • $?:上一条命令执行后返回的状态当返回状态值为0时表示执行正常,非0值表示执行异常或出错
  • $0:当前執行的进程/程序名

建议写在脚本中的命令应先在命令行,执行完成确认结果之后再写入脚本中。第一次编写脚本可能会麻烦一些,當脚本编写完成之后以后再有类似的需求,直接运行脚本即可!


Linux中的kill命令用来终止指定的进程(terminate a process)的运行是Linux下进程管理的常用命令。通常终止一个前台进程可以使用Ctrl+C键,但是对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的在默认情况下,采用编号为15的TERM信号TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号强行“杀掉”该进程。 

发送指定的信号到相应进程不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数其发送的信号为SIGKILL(9) ,将强制结束进程使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程非root用户只能影响自己的进程。

-l  信号若果不加信号的编号参数,则使用“-l”参数會列出全部的信号名称

-a  当处理当前进程时不限制命令名和进程号的对应关系

1、kill命令可以带信号号码选项,也可以不带如果没有信号号碼,kill命令就会发出终止信号(15)这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源也可以用kill向进程发送特定的信号。例洳:

它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号

2、kill可以带有进程ID号作为参數。当用kill向这些进程发送信号时必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程就会得到一個错误信息。

3、可以向多个进程发信号或终止它们

4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息有时这个信息不会马仩显示,只有当按下Enter键使shell的命令提示符再次出现时才会显示出来。

5、应注意信号使进程强行终止,这常会带来一些副作用如数据丢夨或者终端无法恢复到正常状态。发送信号时必须小心只有在万不得已时,才用kill信号(9)因为进程不能首先捕获它。要撤销所有的后台作業可以输入kill 0。因为有些在后台运行的命令会启动多个进程跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时使用kill 0来终止所有由當前shell启动的进程,是个有效的方法

6.kill命令不一定就是用来杀掉某个进程的,同样可以用来传递信号

man kill中对于-0信号参数的解释是

 

一般用来测試指定PID的进程是否存在。

kill -0 PID  向某一进程发送一个无效的信号如果该进程存在(能够接收信号),echo $?为0否则为1,已证明此进程是否存在

实例1:列出所有信号名称

只有第9种信号(SIGKILL)才可以无条件终止进程其他信号进程都有权利忽略。下面是常用的信号:

实例2:得到指定信号的数值

實例3:先用ps查找进程然后用kill杀掉

实例5:杀死指定用户所有进程

方法一,过滤出hnlinux用户进程并杀死

实例6:init进程是不可杀的

init是Linux系统操作中不可缺少的程序之一所谓的init进程,它是一个由内核启动的用户级进程内核自行启动(已经被载入内存,开始运行并已初始化所有的设备驅动程序和数据结构等)之后,就通过启动一个用户级程序init的方式完成引导进程。所以,init始终是第一个进程(其进程编号始终为1) 其它所有进程都是init进程的子孙。init进程是不可杀的!

我要回帖

更多关于 shell脚本顺序执行命令 的文章

 

随机推荐