Linux基础知识 ·

Linux进程管理

[隐藏]

进程管理

程序之间是可以互相控制的,你可以关闭、重新启动服务器软件,服务器软件本身是个程序, 你既然可以让她关闭或启动,当然就是可以控制该程序了,那么程序是如何互相管理的呢?其实是通过给予该程序一个讯号 (signal) 去告知该程序你想要让它做什么。

你可以使用 kill -l (小写的 L ) 或者是 man 7 signal 都可以查询到所支持的讯号:

主要的讯号代号与名称对应及内容是:

代号名称内容
1SIGHUP启动被终止的程序,可让该 PID 重新读取自己的配置文件,类似重新启动
2SIGINT相当于用键盘输入 [ctrl]-c 来中断一个程序的进行
9SIGKILL代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim会有 .filename.swp 保留下来。
15SIGTERM以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
17SIGSTOP相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行

上面仅是常见的 signal 而已,更多的讯号信息请自行 man 7 signal 吧!一般来说,你只要记得『1, 9, 15』这三个号码的意义即可。

kill:依据进程PID管理

那么我们如何传送一个讯号给某个程序呢?就通过 kill 或 killall 吧!底下分别来看看:

kill -signal PID

kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。 要再次强调的是: kill 后面直接加数字与加上 %number 的情况是不同的! 这个很重要!因为后台工作管理中有 1 号工作,但是 PID 1 号则是专指『 init 』这支程序!你怎么可以将 init 关闭呢? 关闭 init ,你的系统就会崩溃!

示例:让 vsftp 程序重新读取配置文件。

了解了这个用法以后,如果未来你想要将某个莫名其妙的登陆者的连线删除的话,就可以通过使用 pstree -p 找到相关程序, 然后再以 kill -9 将该程序删除,该条连线就会被踢掉了!这样很简单吧!

killall:依据进程名称管理

由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等命令找到相对应的那个进程的 ID ,但是,如此一来,很麻烦~有没有可以利用『下达命令的名称』来给予讯号的?举例来说,能不能直接将 vsftp 这个程序给予一个 SIGHUP 的讯号呢?可以的!用 killall 吧!

killall 选项 -signal 命令名称

常用选项:

-e:对于很长的名字, 要求准确匹配. 如果一个命令名长于 15 个字符, 则可能不能用整个名字 (溢出了). 在这种情况下, killall 会杀死所有匹配名字前 15 个字符的所有进程. 有了 -e 选项,这样的记录将忽略. 如果同时指定了 -v 选项, killall 会针对每个忽略的记录打印一条消息.

-g:杀死属于该进程组的进程. kill 信号给每个组只发送一次, 即使同一进程组中包含多个进程.

-i:交互方式,在杀死进程之前征求确认信息.

-l:列出所有已知的信号名.

-q:如果没有进程杀死, 不会提示.

-v:报告信号是否成功发送.

-V:显示版本信息.

-w:等待所有杀的进程死去. killall 会每秒检查一次是否任何被杀的进程仍然存在, 仅当都死光后才返回. 注意:如果信号被忽略或没有起作用, 或者进程停留在僵尸状态, killall 可能会永久等待.


示例:让 vsftp 程序重新读取配置文件。

示例:杀死vsftp服务。

总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的命令名称, 而如果要删除某个服务呢?最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个命令名称启动的程序全部删除。 举例来说,上面的范例当中,系统内所有以 vsftpd 启动的程序,就会通通的被删除啦!

参与评论