天津网站推广,网易企业邮箱格式,app大概需要多少钱,网站开发内容【BASH】回顾与知识点梳理 二十九 二十九. 进程和工作管理29.1 什么是进程 (process)进程与程序 (process program)子进程与父进程#xff1a;fork and exec#xff1a;进程呼叫的流程系统或网络服务#xff1a;常驻在内存的进程 29.2 Linux 的多人多任务环境多人环境… 【BASH】回顾与知识点梳理 二十九 二十九. 进程和工作管理29.1 什么是进程 (process)进程与程序 (process program)子进程与父进程fork and exec进程呼叫的流程系统或网络服务常驻在内存的进程 29.2 Linux 的多人多任务环境多人环境多任务行为多重登入环境的七个基本终端窗口特殊的进程管理行为bash 环境下的工作管理 (job control)多人多任务的系统资源分配问题考虑 29.3 工作管理 (job control)什么是工作管理job control 的管理直接将指令丢到背景中『执行』的 将『目前』的工作丢到背景中『暂停』[ctrl]-z观察目前的背景工作状态 jobs将背景工作拿到前景来处理fg让工作在背景下的状态变成运作中 bg管理背景当中的工作 kill 29.4 脱机管理问题 该系列目录 -- 【BASH】回顾与知识点梳理目录
二十九. 进程和工作管理
一个程序被加载到内存当中运作那么在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念所有系统上面跑的数据都会以进程的型态存在。那么系统的进程有哪些状态不同的状态会如何影响系统的运作 进程之间是否可以互相控管等等的这些都是我们所必须要知道的项目。 另外与进程有关的还有 SELinux 这个加强文件存取安全性的咚咚也必须要做个了解呢
29.1 什么是进程 (process)
由前面一连几个章节的数据看来我们一直强调在 Linux 底下所有的指令与你能够进行的动作都与权限有关 而系统如何判定你的权限呢当然就是账号管理当中提到的 UID/GID 的相关概念以及文件的属性相关性啰
再进一步来解释你现在大概知道在 Linux 系统当中『触发任何一个事件时系统都会将他定义成为一个进程并且给予这个进程一个 ID 称为 PID同时依据启发这个进程的用户与相关属性关系给予这个 PID 一组有效的权限设定。』 从此以后这个 PID 能够在系统上面进行的动作就与这个 PID 的权限有关了
看这个定义似乎没有什么很奇怪的地方不过您得要了解什么叫做『触发事件』才行啊 我们在什么情况下会触发一个事件而同一个事件可否被触发多次呵呵来了解了解先
进程与程序 (process program)
我们如何产生一个进程呢其实很简单啦就是『执行一个程序或指令』就可以触发一个事件而取得一个 PID 啰我们说过系统应该是仅认识 binary file 的那么当我们要让系统工作的时候当然就是需要启动一个 binary file 啰那个 binary file 就是程序 (program) 啦
那我们知道每个程序都有三组人马的权限每组人马都具有 r/w/x 的权限所以『不同的使用者身份执行这个 program 时系统给予的权限也都不相同』举例来说我们可以利用 touch 来建立一个空的文件当 root 执行这个 touch 指令时他取得的是 UID/GID 0/0 的权限而当 dmtsai (UID/GID501/501) 执行这个 touch 时他的权限就跟 root 不同啦我们将这个概念绘制成图示来瞧瞧如下 如上图所示程序一般是放置在实体磁盘中然后透过用户的执行来触发。触发后会加载到内存中成为一个个体那就是进程。 为了操作系统可管理这个进程因此进程有给予执行者的权限/属性等参数并包括程序所需要的脚本与数据或文件数据等 最后再给予一个 PID 。系统就是透过这个 PID 来判断该 process 是否具有权限进行工作的他是很重要的哩
举个更常见的例子我们要操作系统的时候通常是利用联机程序或者直接在主机前面登入然后取得我们的 shell 对吧那么我们的 shell 是 bash 对吧这个 bash 在 /bin/bash 对吧那么同时间的每个人登入都是执行 /bin/bash 对吧不过每个人取得的权限就是不同也就是说我们可以这样看 也就是说当我们登入并执行 bash 时系统已经给我们一个 PID 了这个 PID 就是依据登入者的UID/GID (/etc/passwd) 来的啦以上面的两张图来做说明的话我们知道 /bin/bash 是一个程序 (program)当 dmtsai 登入后他取得一个 PID 号码为 2234 的进程这个进程的 User/Group 都是 dmtsai 而当这个程序进行其他作业时例如上面提到的 touch 这个指令时 那么由这个进程衍生出来的其他进程在一般状态下也会沿用这个进程的相关权限的
让我们将程序与进程作个总结
程序 (program)通常为 binary program 放置在储存媒体中 (如硬盘、光盘、软盘、磁带等) 为实体文件的型态存在进程 (process)程序被触发后执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中 操作系统并给予这个内存内的单元一个标识符 (PID)可以说进程就是一个正在运作中的程序。
子进程与父进程
在上面的说明里面我们有提到所谓的『衍生出来的进程』那是个啥咚咚这样说好了当我们登入系统后会取得一个 bash 的 shell 然后我们用这个 bash 提供的接口去执行另一个指令例如 /usr/bin/passwd 或者是 touch 等等那些另外执行的指令也会被触发成为 PID 呵呵那个后来执行指令才产生的 PID 就是『子进程』了而在我们原本的 bash 环境下就称为『父进程』了 借用我们在 Bash 谈到的 export 所用的图示好了 所以你必须要知道程序彼此之间是有相关性的以上面的图示来看连续执行两个 bash 后第二个 bash 的父进程就是前一个 bash。因为每个进程都有一个 PID 那某个进程的父进程该如何判断就透过 Parent PID (PPID) 来判断即可。此外由第十章的 export 内容我们也探讨过环境变量的继承问题子进程可以取得父进程的环境变量啦(注意是环境变量) 让我们来进行底下的练习以了解什么是子进程/父进程。 请在目前的 bash 环境下再触发一次 bash 并以『 ps -l 』这个指令观察进程相关的输出信息。 答直接执行 bash 会进入到子进程的环境中然后输入 ps -l 后出现 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 13928 13927 0 80 0 - 29038 wait pts/0 00:00:00 bash 0 S 1000 13970 13928 1 80 0 - 29033 wait pts/0 00:00:00 bash 0 R 1000 14000 13970 0 80 0 - 30319 - pts/0 00:00:00 ps 有看到那个 PID 与 PPID 吗第一个 bash 的 PID 与第二个 bash 的 PPID 都是 13928 啊 因为第二个bash 是来自于第一个所产生的嘛另外每部主机的程序启动状态都不一样 所以在你的系统上面看到的PID 与我这里的显示一定不同那是正常的详细的 ps 指令我们会在本章稍后介绍 这里你只要知道 ps -l 可以查阅到相关的进程信息即可。 很多朋友常常会发现『咦明明我将有问题的进程关闭了怎么过一阵子他又自动的产生 而且新产生的那个进程的 PID 与原先的还不一样这是怎么回事呢』不要怀疑如果不是 crontab 工作排程的影响肯定有一支父进程存在所以你杀掉子进程后 父进程就会主动再生一支那怎么办正所谓这『擒贼先擒王』找出那支父进程然后将他删除就对啦
fork and exec进程呼叫的流程
其实子进程与父进程之间的关系还挺复杂的最大的复杂点在于进程互相之间的呼叫。在 Linux 的进程呼叫通常称为 fork-and-exec 的流程进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序最终就成为一个子进程的存在。 整个流程有点像底下这张图 (1) 系统先以 fork 的方式复制一个与父进程相同的暂存进程这个进程与父进程唯一的差别就是 PID 不同 但是这个暂存进程还会多一个 PPID 的参数PPID 如前所述就是父进程的进程标识符啦 (2) 暂存进程开始以 exec 的方式加载实际要执行的程序以上述图标来讲新的程序名称为 qqq 最终子进程的程序代码就会变成 qqq 了 这样了解乎
系统或网络服务常驻在内存的进程
如果就我们之前学到的一些指令数据来看其实我们下达的指令都很简单包括用 ls 显示文件啊、用 touch 建立文件啊、rm/mkdir/cp/mv 等指令管理文件啊、chmod/chown/passwd 等等的指令来管理权限等等的不过 这些指令都是执行完就结束了。也就是说该项指令被触发后所产生的 PID 很快就会终止呢 那有没有一直在执行的进程啊当然有啊而且多的是呢
举个简单的例子来说好了我们知道系统每分钟都会去扫瞄 /etc/crontab 以及相关的配置文件 来进行工作排程吧那么那个工作排程是谁负责的当然不是鸟哥啊 呵呵是 crond 这个程序所管理的我们将他启动在背景当中一直持续不断的运作 套句鸟哥以前 DOS 年代常常说的一句话那就是『常驻在内存当中的进程』啦
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务因此这些常驻程序就会被我们称为服务 (daemon)。系统的服务非常的多不过主要大致分成
系统本身所需要的服务例如刚刚提到的 crond 及 atd 还有 rsyslogd 等等的。还有一些则是负责网络联机的服务例如Apache, named, postfix, vsftpd… 等等的。这些网络服务比较有趣的地方在于这些程序被执行后他会启动一个可以负责网络监听的端口口 (port) 以提供外部客户端 (client) 的联机要求。 以 crontab 来说他的主要执行程序名称应该是 cron 或 at 才对为啥要加个 d 在后面而成为 crond, atd 呢就是因为 Linux 希望我们可以简单的判断该程序是否为 daemon 所以一般daemon 类型的程序都会加上 d 在文件名后头包括服务器篇我们会看到的 httpd, vsftpd 等等都是 ^_^。 29.2 Linux 的多人多任务环境
为什么 Linux 这么多用户但是却每个人都可以拥有自己的环境了吧^_^ 底下我们来谈谈 Linux 多人多任务环境的特色
多人环境
Linux 最棒的地方就在于他的多人多任务环境了那么什么是『多人多任务』在 Linux 系统上面具有多种不同的账号 每种账号都有都有其特殊的权限只有一个人具有至高无上的权力那就是root (系统管理员)。除了 root 之外其他人都必须要受一些限制的而每个人进入 Linux 的环境设定都可以随着每个人的喜好来设定 (还记得我们在 BASH 提过的 ~/.bashrc 吧对了就是那个光)现在知道为什么了吧因为每个人登入后取得的 shell 的 PID 不同嘛
多任务行为
我们在前面谈到 CPU 的速度目前的 CPU 速度可高达几个 GHz。 这代表 CPU 每秒钟可以运作 10^9 这么多次指令。我们的 Linux 可以让 CPU 在各个工作间进行切换 也就是说其实每个工作都仅占去 CPU 的几个指令次数所以 CPU 每秒就能够在各个进程之间进行切换啦 谁叫 CPU 可以在一秒钟进行这么多次的指令运作。
CPU 切换进程的工作与这些工作进入到 CPU 运作的排程 (CPU 排程非 crontab 排程) 会影响到系统的整体效能 目前 Linux 使用的多任务切换行为是非常棒的一个机制几乎可以将 PC 的性能整个压榨出来 由于效能非常好因此当多人同时登入系统时其实会感受到整部主机好像就为了你存在一般 这就是多人多任务的环境啦
多重登入环境的七个基本终端窗口
在 Linux 当中默认提供了六个文字界面登入窗口以及一个图形界面你可以使用 [Alt][F1]…[F7] 来切换不同的终端机界面而且每个终端机界面的登入者还可以不同人 很炫吧这个东西可就很有用啦尤其是在某个进程死掉的时候
其实这也是多任务环境下所产生的一个情况啦我们的 Linux 默认会启动六个终端机登入环境的程序所以我们就会有六个终端机接口。 您也可以减少啊就是减少启动的终端机程序就好了。
特殊的进程管理行为
老实说 Linux 几乎可以说绝对不会当机的因为他可以在任何时候将某个被困住的进程杀掉然后再重新执行该进程而不用重新启动够炫吧那么如果我在 Linux 下以文字界面登入在屏幕当中显示错误讯息后就挂了动都不能动该如何是好 这个时候那默认的七个窗口就帮上忙啦你可以随意的再按 [Alt][F1]…[F7] 来切换到其他的终端机界面然后以 ps -aux 找出刚刚的错误进程然后给他 kill 一下哈哈回到刚刚的终端机界面恩棒又回复正常啰
为什么可以这样做呢我们刚刚不是提过吗每个进程之间可能是独立的也可能有相依性 只要到独立的进程当中删除有问题的那个进程当然他就可以被系统移除掉啦
bash 环境下的工作管理 (job control)
我们在上一个小节有提到所谓的『父进程、子进程』的关系那我们登入 bash 之后 就是取得一个名为 bash 的 PID 了而在这个环境底下所执行的其他指令就几乎都是所谓的子进程了。那么在这个单一的 bash 接口下我可不可以进行多个工作啊 当然可以啦可以『同时』进行喔举例来说我可以这样做
[rootstudy ~]# cp file1 file2 在这一串指令中重点在那个 的功能他表示将 file1 这个文件复制为 file2 且放置于背景中执行 也就是说执行这一个命令之后在这一个终端接口仍然可以做其他的工作而当这一个指令(cp file1 file2) 执行完毕之后系统将会在你的终端接口显示完成的消息很便利喔
多人多任务的系统资源分配问题考虑
多人多任务确实有很多的好处但其实也有管理上的困扰因为使用者越来越多 将导致你管理上的困扰哩另外由于使用者日盛当使用者达到一定的人数后 通常你的机器便需要升级了因为 CPU 的运算与 RAM 的大小可能就会不敷使用
举个例子来说鸟哥之前的网站管理的有点不太好因为使用了一个很复杂的人数统计程序 这个程序会一直去取用 MySQL 数据库的数据偏偏因为流量大造成 MySQL 很忙碌。 在这样的情况下当鸟哥要登入去写网页数据或者要去使用讨论区的资源时 哇慢的很简直就是『龟速』啊后来终于将这个程序停止不用了 以自己写的一个小程序来取代呵呵这样才让 CPU 的负载 (loading) 整个降下来 用起来顺畅多了 ^_^
29.3 工作管理 (job control)
这个工作管理 (job control) 是用在 bash 环境下的也就是说『当我们登入系统取得 bash shell 之后在单一终端机接口下同时进行多个工作的行为管理 』。举例来说我们在登入 bash 后 想要一边复制文件、一边进行资料搜寻、一边进行编译还可以一边进行 vim 程序撰写 当然我们可以重复登入那六个文字接口的终端机环境中不过能不能在一个 bash 内达成 当然可以啊就是使用 job control 啦 ^_^
什么是工作管理
从上面的说明当中你应该要了解的是『进行工作管理的行为中 其实每个工作都是目前 bash 的子进程亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash 』 这个概念请你得先建立起来后续的范例介绍之后你就会清楚的了解啰
或许你会觉得很奇怪啊既然我可以在六个终端接口登入那何必使用 job control 呢不要忘记了呢我们可以在 /etc/security/limits.conf 里面设定使用者同时可以登入的联机数在这样的情况下某些使用者可能仅能以一个联机来工作呢 所以啰你就得要了解一下这种工作管理的模式了此外这个章节内容也会牵涉到很多的数据流重导向。
假设我们只有一个终端接口因此在可以出现提示字符让你操作的环境就称为前景 (foreground)至于其他工作就可以让你放入背景 (background)去暂停或运作。要注意的是放入背景的工作想要运作时 他必须不能够与使用者互动。举例来说 vim 绝对不可能在背景里面执行(running) 的因为你没有输入数据他就不会跑啊 而且放入背景的工作是不可以使用 [ctrl]c 来终止的
总之要进行 bash 的 job control 必须要注意到的限制是
这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash)前景你可以控制与下达指令的这个环境称为前景的工作 (foreground)背景可以自行运作的工作你无法使用 [ctrl]c 终止他可使用 bg/fg 呼叫该工作背景中『执行』的进程不能等待 terminal/shell 的输入(input)
job control 的管理
如前所述bash 只能够管理自己的工作而不能管理其他 bash 的工作所以即使你是 root 也不能够将别人的 bash 底下的 job 给他拿过来执行。此外又分前景与背景然后在背景里面的工作状态又可以分为『暂停 (stop)』与『运作中 (running)』。那实际进行 job 控制的指令有哪些底下就来谈谈。
直接将指令丢到背景中『执行』的
如同前面提到的我们在只有一个 bash 的环境下如果想要同时进行多个工作 那么可以将某些工作直接丢到背景环境当中让我们可以继续操作前景的工作那么如何将工作丢到背景中 最简单的方法就是利用『 』这个玩意儿了举个简单的例子我们要将 /etc/ 整个备份成为/tmp/etc.tar.gz 且不想要等待那么可以这样做
[rootstudy ~]# tar -zpcf /tmp/etc.tar.gz /etc
[1] 14432 [job number] PID
[rootstudy ~]# tar: Removing leading / from member names
# 在中括号内的号码为工作号码 (job number)该号码与 bash 的控制有关。
# 后续的 14432 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行的数据流
# 由于我们没有加上数据流重导向所以会影响画面不过不会影响前景的操作喔不过那么丢到背景中的工作什么时候完成完成的时候会显示什么如果你输入几个指令后突然出现这个数据
[1] Done tar -zpcf /tmp/etc.tar.gz /etc就代表 [1] 这个工作已经完成 (Done) 该工作的指令则是接在后面那一串指令列。这样了解了吧另外这个 代表『将工作丢到背景中去执行』喔 注意到那个『执行』的字眼此外这样的情况最大的好处是 不怕被 [ctrl]c 中断的啦 此外将工作丢到背景当中要特别注意资料的流向喔包括上面的讯息就有出现错误讯息导致我的前景被影响。 虽然只要按下 [enter] 就会出现提示字符。但如果我将刚刚那个指令改成
[rootstudy ~]# tar -zpcvf /tmp/etc.tar.gz /etc 情况会怎样在背景当中执行的指令如果有 stdout 及 stderr 时他的数据依旧是输出到屏幕上面的所以我们会无法看到提示字符当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar 此时你怎么按下 [ctrl]c 也无法停止屏幕被搞的花花绿绿的所以啰最佳的状况就是利用数据流重导向 将输出数据传送至某个文件中。举例来说我可以这样做
[rootstudy ~]# tar -zpcvf /tmp/etc.tar.gz /etc /tmp/log.txt 21
[1] 14547
[rootstudy ~]#呵呵如此一来输出的信息都给他传送到 /tmp/log.txt 当中当然就不会影响到我们前景的作业了。这样说您应该可以更清楚数据流重导向的重要性了吧^_^ 工作号码 (job number) 只与你这个 bash 环境有关但是他既然是个指令触发的咚咚所以当然一定是一个进程 因此你会观察到有 job number 也搭配一个 PID 将『目前』的工作丢到背景中『暂停』[ctrl]-z
想个情况如果我正在使用 vim 却发现我有个文件不知道放在哪里需要到 bash 环境下进行搜寻此时是否要结束 vim 呢呵呵当然不需要啊只要暂时将 vim 给他丢到背景当中等待即可。例如以下的案例
[rootstudy ~]# vim ~/.bashrc
# 在 vim 的一般模式下按下 [ctrl]-z 这两个按键
[1] Stopped vim ~/.bashrc
[rootstudy ~]# 顺利取得了前景的操控权
[rootstudy ~]# find / -print
....(输出省略)....
# 此时屏幕会非常的忙碌因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停
[2] Stopped find / -print在 vim 的一般模式下按下 [ctrl] 及 z 这两个按键屏幕上会出现 [1] 表示这是第一个工作 而那个 代表最近一个被丢进背景的工作且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )而那个 Stopped 则代表目前这个工作的状态。在预设的情况下使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态喔
观察目前的背景工作状态 jobs
[rootstudy ~]# jobs [-lrs]
选项与参数
-l 除了列出 job number 与指令串之外同时列出 PID 的号码
-r 仅列出正在背景 run 的工作
-s 仅列出正在背景当中暂停 (stop) 的工作。# 范例一观察目前的 bash 当中所有的工作与对应的 PID
[rootstudy ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2] 14567 Stopped find / -print如果想要知道目前有多少的工作在背景当中就用 jobs 这个指令吧一般来说直接下达 jobs 即可 不过如果你还想要知道该 job number 的 PID 号码可以加上 -l 这个参数啦 在输出的信息当中例如上表仔细看到那个 - 号喔那个 代表预设的取用工作。 所以说『目前我有两个工作在背景当中两个工作都是暂停的 而如果我仅输入 fg 时那么那个 [2] 会被拿到前景当中来处理』
将背景工作拿到前景来处理fg
刚刚提到的都是将工作丢到背景当中去执行的那么有没有可以将背景工作拿到前景来处理的 有啊就是那个fg (foreground)啦举例来说我们想要将上头范例当中的工作拿出来处理时
[rootstudy ~]# fg %jobnumber
选项与参数
%jobnumber jobnumber 为工作号码(数字)。注意那个 % 是可有可无的# 范例一先以 jobs 观察工作再将工作取出
[rootstudy ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2] 14567 Stopped find / -print
[rootstudy ~]# fg 预设取出那个 的工作亦即 [2]。立即按下[ctrl]-z
[rootstudy ~]# fg %1 直接规定取出的那个工作号码再按下[ctrl]-z
[rootstudy ~]# jobs -l
[1] 14566 Stopped vim ~/.bashrc
[2]- 14567 Stopped find / -print经过 fg 指令就能够将背景工作拿到前景来处理啰不过比较有趣的是最后一个显示的结果我们会发现 出现在第一个工作后 怎么会这样啊这是因为你刚刚利用 fg %1 将第一号工作捉到前景后又放回背景此时最后一个被放入背景的将变成 vi 那个指令动作所以当然 [1] 后面就会出现 了了解乎另外如果输入『fg -』 则代表将 - 号的那个工作号码拿出来上面就是 [2]- 那个工作号码啦
让工作在背景下的状态变成运作中 bg
我们刚刚提到那个 [ctrl]-z 可以将目前的工作丢到背景底下去『暂停』 那么如何让一个工作在背景底下『 Run 』呢我们可以在底下这个案例当中来测试 注意喔底下的测试要进行的快一点^_^
# 范例一一执行 find / -perm /7000 /tmp/text.txt 后立刻丢到背景去暂停
[rootstudy ~]# find / -perm /7000 /tmp/text.txt
# 此时请立刻按下 [ctrl]-z 暂停
[3] Stopped find / -perm /7000 /tmp/text.txt# 范例二让该工作在背景下进行并且观察他
[rootstudy ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3] Stopped find / -perm /7000 /tmp/text.txt
[3] find / -perm /7000 /tmp/text.txt
[1]- Stopped vim ~/.bashrc
[2] Stopped find / -print
[3] Running find / -perm /7000 /tmp/text.txt 看到哪里有差异吗呼呼没错就是那个状态栏以经由 Stopping 变成了 Running 啰 看到差异点嘿嘿指令列最后方多了一个 的符号啰 代表该工作被启动在背景当中了啦 ^_^
管理背景当中的工作 kill
刚刚我们可以让一个已经在背景当中的工作继续工作也可以让该工作以 fg 拿到前景来 那么如果想要将该工作直接移除呢或者是将该工作重新启动呢这个时候就得需要给予该工作一个讯号 (signal) 让他知道该怎么作才好啊此时 kill 这个指令就派上用场啦
[rootstudy ~]# kill -signal %jobnumber
[rootstudy ~]# kill -l
选项与参数
-l 这个是 L 的小写列出目前 kill 能够使用的讯号 (signal) 有哪些signal 代表给予后面接的那个工作什么样的指示啰用 man 7 signal 可知-1 重新读取一次参数的配置文件 (类似 reload)-2 代表与由键盘输入 [ctrl]-c 同样的动作-9 立刻强制删除一个工作-15以正常的进程方式终止一项工作。与 -9 是不一样的。# 范例一找出目前的 bash 环境下的背景工作并将该工作『强制删除』。
[rootstudy ~]# jobs
[1] Stopped vim ~/.bashrc
[2] Stopped find / -print
[rootstudy ~]# kill -9 %2; jobs
[1] Stopped vim ~/.bashrc
[2] Killed find / -print
# 再过几秒你再下达 jobs 一次就会发现 2 号工作不见了因为被移除了# 范例二找出目前的 bash 环境下的背景工作并将该工作『正常终止』掉。
[rootstudy ~]# jobs
[1] Stopped vim ~/.bashrc
[rootstudy ~]# kill -SIGTERM %1
# -SIGTERM 与 -15 是一样的您可以使用 kill -l 来查阅
# 不过在这个案例中 vim 的工作无法被结束喔因为他无法透过 kill 正常终止的意思特别留意一下 -9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的 -15 则是以正常步骤结束一项工作(15 也是默认值)两者之间并不相同呦举上面的例子来说 我用 vim 的时候不是会产生一个 .filename.swp 的文件吗 那么当使用 -15 这个 signal 时 vim 会尝试以正常的步骤来结束掉该 vi 的工作 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个signal 时由于该 vim 工作会被强制移除掉因此 .filename.swp 就会继续存在文件系统当中。这样您应该可以稍微分辨一下了吧 不过毕竟正常的作法中你应该先使用 fg 来取回前景控制权然后再离开 vim 才对因此以上面的范例二为例其实 kill 确实无法使用 -15 正常的结束掉 vim 的动作喔此时还是不建议使用 -9 啦因为你知道如何正常结束该进程不是吗 通常使用 -9 是因为某些程序你真的不知道怎么透过正常手段去终止他这才用到 -9 的 其实kill 的妙用是很无穷的啦他搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关资料) 可以让您有效的管理工作与进程 (Process)此外那个 killall 也是同样的用法 至于常用的 signal 您至少需要了解 1, 9, 15 这三个 signal 的意义才好。 此外 signal 除了以数值来表示之外也可以使用讯号名称喔 举例来说上面的范例二就是一个例子啦至于 signal number 与名称的对应 呵呵使用 kill -l 就知道啦(L 的小写)
另外 kill 后面接的数字默认会是 PID 如果想要管理 bash 的工作控制就得要加上 %数字 了这点也得特别留意才行喔
29.4 脱机管理问题
要注意的是我们在工作管理当中提到的『背景』指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境 你可以说那个是 bash 的背景并不是放到系统的背景去喔所以工作管理的背景依旧与终端机有关啦 在这样的情况下如果你是以远程联机方式连接到你的 Linux 主机并且将工作以 的方式放到背景去 请问在工作尚未结束的情况下你脱机了该工作还会继续进行吗答案是『否』不会继续进行而是会被中断掉。
那怎么办如果我的工作需要进行一大段时间我又不能放置在背景底下那该如何处理呢 首先你可以参考前一章的 at 来处理即可因为 at 是将工作放置到系统背景 而与终端机无关。如果不想要使用 at 的话那你也可以尝试使用 nohup 这个指令来处理喔这个 nohup 可以让你在脱机或注销系统后还能够让工作继续进行。他的语法有点像这样
[rootstudy ~]# nohup [指令与参数] 在终端机前景中工作
[rootstudy ~]# nohup [指令与参数] 在终端机背景中工作有够好简单的指令吧上述指令需要注意的是 nohup 并不支持 bash 内建的指令因此你的指令必须要是外部指令才行。 我们来尝试玩一下底下的任务吧
# 1. 先编辑一支会『睡着 500 秒』的程序
[rootstudy ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo I have slept 500 seconds.
# 2. 丢到背景中去执行并且立刻注销系统
[rootstudy ~]# chmod ax sleep500.sh
[rootstudy ~]# nohup ./sleep500.sh
[2] 14812
[rootstudy ~]# nohup: ignoring input and appending output to nohup.out 会告知这个讯息
[rootstudy ~]# exit如果你再次登入的话再使用 pstree 去查阅你的进程会发现 sleep500.sh 还在执行中喔并不会被中断掉 这样了解意思了吗由于我们的程序最后会输出一个讯息但是 nohup 与终端机其实无关了因此这个讯息的输出就会被导向『 ~/nohup.out 』所以你才会看到上述指令中当你输入 nohup 后 会出现那个提示讯息啰。
如果你想要让在背景的工作在你注销后还能够继续的执行那么使用nohup 搭配 是不错的运作情境喔 可以参考看看