程序的删除
我们在前几个小节提到的‘背景工作管理’当中提到过, 要给予某个已经存在的工作某些动作时,是直接给予一个讯号 (signal) 给该 PID 即可。 常见的工作可以使用 kill -l (L 的小写) 来查阅!而主要的讯号代号与名称对应及内容是:
代号 名称 内容
1 SIGHUP 代表‘让该 PID 重新读取自己的设定档’ ,类似重新启动
2 SIGINT 代表用键盘输入的 [ctrl]-c 来中断一个程序的进行。
9 SIGKILL 代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有‘半产品’产生,类似 vim会有 .filename.swp 保留下来。
15 SIGTERM 以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
而 kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字), 也就是说, kill 后面直接加数字与加上 % 的情况是不同的!这个很重要喔!不要搞错了。 我们就活用一下 kill 与刚刚上面提到的 ps 来做个简单的练习吧!
例题:以 ps 找出 syslog 这个服务的 PID 后,再使用 kill 重新读取 syslog 的设定档资料:
答:
我们可以使用底下的方式找出 syslog 的 PID 喔!
ps aux | grep 'syslog' | grep -v 'grep'| awk '{print $2}' 接下来,再给予 kill -SIGHUP 的讯号至该 PID ,所以,整个指令串可以这样写:
kill -SIGHUP `ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}'` 然后立刻 tail -n 5 /var/log/messages 看看 syslog 有没有重新被启动啊?
由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等指令,因为我们必须要找到相对应的那个程序的 ID 嘛!但是,如此一来,很麻烦~ 有没有可以利用‘下达指令的名称’来给予讯号的?举例来说,能不能直接将 syslog 这个程序给予一个 SIGHUP 的讯号呢?可以的!用 killall 吧!
killall的意义主要是对进程的名称发送一个signal信号的,而kill后面则是接数字或者是程序的号码。这一点是非常重要的。
[root@linux ~]# killall [-iIe] [command name]
参数:
-i :interactive 的意思,互动式的,若需要删除时,会出现提示字元给使用者;
-e :exact 的意思,表示‘后面接的 command name 要一致’,但整个完整的指令不能超过 15 个字元。
-I :指令名称(可能含参数)忽略大小写。
范例:
范例一:给予 syslogd 这个指令启动的 PID 一个 SIGHUP 的讯号
[root@linux ~]# killall -1 syslogd
# 如果用 ps aux 仔细看一下,syslogd 才是完整的指令名称。但若包含整个参数,则 syslogd -m 0 才是完整的呢!
范例二:强制终止所有以 httpd 启动的程序
[root@linux ~]# killall -9 httpd
总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的指令名称, 而如果要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名称启动的程序全部删除。 举例来说,上面的范例二当中,系统内所有以 httpd 启动的程序,就会通通的被删除啦! ^_^
阅读(2687) | 评论(0) | 转发(0) |