作者:东缘
由于职责要求你不得不费力地阅读那些令你感到费解晦涩Linux应用介绍说明文件然后你将运行指令和编辑设置文件切都在正常运行生活真美好但是你知道好时光不会永远持续下去当你遇到令人恐惧“send the process a SIGHUP”提示时好时光结束了
什么是“SIGHUP(启动信号)”你如何发送它?它像是你送给你恋人束花吗?虽然你可以肯定这不是个命令行指令不过你还是试着键入它当然这没有结果然后你检查下键盘哦没有SIGHUP键于是你又重新阅读这个应用参考指南看到下面这段文字:
当收到个hangup(进程结束)信号时sshd会重新阅读配置文件通过执行启动时命令及选项来发送SIGHUP信号如:/usr/sbin/sshd
哦原来是这样
员 VS 使用者
LINUX在线参考指南作者般都要既照顾到最终用户需求也要照顾到高级员需求因此有些介绍说明比较难懂不过不要担心现在我们就要揭开覆盖在这些让人迷惑内容上面那神秘面纱
信号和进程控制
这个问题主要属于信号和进程控制范畴对于我们系统管理员和普通用户来说我们主要关心是启动、停止和重新启动服务、停止失控进程和被挂起进程并且尽可能不中断系统运行区别操作系统和区别命令外壳处理信号方式都不相同我们这里只介绍Linux操作系统和bash外壳
信号是用来和守护和进程通信任何活动任务都是个进程而守护是等待对某些事件做出反应或者按照日程安排执行任务后台服务个必须有建在其中信号处理用于捕获和应答信号在LINUX中signal 参考指南解释了各种区别信号和这些信号用途信号是由“kill”命令发出kill -l命令可以显示个可用信号列表及其编号
所有守护和进程都有个进程ID(PID)例如使用ps命名所显示内容:
$ ps aux
USER PID %CPU %MEM TTY STAT COMMAND
root 1 0.0 0.1 ? S init [2]
105 7783 0.0 0.2 ? Ss /usr/bin/dbus-daemon --system
hal 7796 0.0 0.7 ? Ss /usr/sbin/hald
postfix 7957 0.0 0.2 ? S qmgr -l -t fo -u -c
nagios 8371 0.0 0.2 ? SNs /usr/sbin/nagios /etc/nagios/nagios.cfg
这个输出是经过简化你在系统中可以看到更多行和栏目如果某些进程消耗了你全部CPU或者内存你可以在这个输出%CPU和%MEM列中发现它们找到失控进程种更快捷思路方法是使用top命令按照默认设置使用占用CPU资源最多进程在最上面显示我们可以使用条“yes”命令来测试下:
$ yes carla is teh awesum
这个命令将以很高速度反复显示“carla is teh awesum”直到你停止它运行这将使你CPU使用率达到警戒线
$ top
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole
22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes
分析下这个结果你会发现些有趣事你会发现占用CPU最多是konsole虚拟终端而不是“yes”命令这是“yes”命令是在konsole终端中运行如果在个“真正”控制台(按Ctrl+alt+f2键)中运行同样命令序列你将看到“yes”命令被排在第位
有许多停止“yes”命令运行方式如果你要回到运行它shell中按CTRL+c键就可以了或者你可以在另个shell中用“kill”命令停止“yes”命令运行Kill命令后面跟PID或者命令名称如下如示:
$ kill 22236
或者
$ killall yes
按CTRL+c键发出个SIGINT(信号2)这个信号是键盘要求取得控制权中断信号kill和killall这两个命令按照默认设置都发出个SIGTERM信号(编号15)中可以设置对SIGTERM信号(15)是捕捉或者忽略或者以区别方式解释因此如果你对于KILL命令反应和你预期区别很可能是被KILL目标问题
终止个父进程通常也终止了它子进程不过情况并不总是如此你知道子进程是什么吗?使用ps命令加上-f选项就可以看到如下所示:
$ ps axf
22371 ? R 2:35 _ konsole [kdeinit]
22372 pts/3 Ss 0:00 | _ /bin/bash
24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum
22381 pts/4 Rs 0:00 | _ /bin/bash
24323 pts/4 R+ 0:00 | | _ ps axf
现在回到SIGHUP话题
SIGHUP发音是“sig-hup”是signal hangup缩写含义是“中止信号”你如何发送个SIGHUP信号呢?这里有几种方式:
# kill -HUP [pid]
# killall -HUP [process-name]
# kill -1 [pid]
# killall -1 [process-name]
因此你可以使用PID或者名称信号名称或者号码那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己init(化)文件来控制服务是优先选择方式这些文件通常包含健全和检查以及额外功能使用“kill”命令和信号主要原因是尽可能明确地终止挂起和失控进程而不必重新启动或者登出
终止进程
正如你在有关信号man page中所看到有十几种控制进程思路方法下面是些常用思路方法:
kill -STOP [pid]
发送SIGSTOP (17,19,23)停止个进程而并不消灭这个进程
kill -CONT [pid]
发送SIGCONT (19,18,25)重新开始个停止进程
kill -KILL [pid]
发送SIGKILL (9)强迫进程立即停止并且不实施清理操作
kill -9 -1
终止你拥有全部进程
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略但是其它信号可以所以这是你终极武器
Bash shellKil命令l
Bash外壳包含个内置kill命令当执行下面命令:
$ type -all kill
kill is a shell built-in
kill is /bin/kill
命令结果表明有两个kill命令个是BASH内置命令另个是/bin/kill可执行般来说这两个命令不太可能遇到冲突情况不过如果你确实遇到了kill命令行为异常时你可以明确指定/bin/kill命令
你定要进步查阅下面资源中列出参考资源来了解Linux中kill妙用这是你进入维护Linux系统领域门票这些知识能够让你像做外科手术样对系统进行维护而不用在遇到问题时每次都重新启动系统就像我们知道某些蹩脚操作系统那样
资源
Linux Cookbook书第 7章“开始和终止Linux”
bash (1) - GNU Bourne-Again Shell
yes (1) - 在被终止前反复打印
signal (7) - 可用信号列表
ps (1) - 报告当前进程快照
kill (1) - 向个进程发出信号
killall (1) - 按名字消灭进程
pkill (1) - 根据名字和其它属性查看或者发出进程信号
skill (1) - 发送个信号或者报告进程状态
xkill (1) - 按照X资源消灭个客户
最新评论