一. 终止进程的工具 kill 、killall、pkill、xkill
终止一个进程或终止一个正在运行的程序,一般是通过 kill 、killall、pkill、xkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。
另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些 工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如 mysql服务器最好是按其正常的程序关闭,而不是用pkill mysqld 或killall mysqld 这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用kill 来杀掉。
1. kill
kill的应用是和ps 或pgrep 命令结合在一起使用的;
kill 的用法:
kill [信号代码] 进程ID
注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;
举例:
[root@localhost ~]# ps auxf |grep httpd
root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd
root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;
我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830的话,其下的子进程也会跟着死掉;
[root@localhost ~]# kill 4840 注:杀掉4840这个进程;
[root@localhost ~]# ps -auxf |grep httpd 注:查看一下会有什么结果?是不是httpd服务器仍在运行?
[root@localhost ~]# kill 4830 注:杀掉httpd的父进程;
[root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?
对于僵尸进程,可以用kill -9 来强制终止退出;
比如一个程序已经彻底死掉,如果kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;比如;
[root@localhost ~]# ps aux |grep gaim
beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim
或 [root@localhost ~]# pgrep -l gaim
5031 gaim
[root@localhost ~]# kill -9 5031
2. killall
killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。
用法:killall 正在运行的程序名
killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行;
举例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# killall gaim
3. pkill
pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
应用方法:
#pkill 正在运行的程序名
举例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim
4. xkill
xkill 是在桌面用的杀死图形界面的程序。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消;
xkill 调用方法:
[root@localhost ~]# xkill
二.Linux的kill命令与信号控制
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件 做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在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 fifo -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 shell的Kil命令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一书的第七章“开始和终止Linux”
bash (1) - GNU Bourne-Again Shell
yes (1) - 在被终止前反复打印字符
signal (7) - 可用信号列表
ps (1) - 报告当前进程的快照
kill (1) - 向一个进程发出信号
killall (1) - 按名字消灭进程
pkill (1) - 根据名字和其它属性查看或者发出进程信号
skill (1) - 发送一个信号或者报告进程状态
xkill (1) - 按照X资源消灭一个客户程序
1、OpenSSH软件包组成:
[root@www ~]# rpm -qa | grep ssh
openssh-clients-3.9p1-8.RHEL4.24
openssh-3.9p1-8.RHEL4.24
openssh-askpass-3.9p1-8.RHEL4.24
openssh-server-3.9p1-8.RHEL4.24
openssh-askpass-gnome-3.9p1-8.RHEL4.24
2、OpenSSh服务的启动与停止:
[root@www ~]# chkconfig --list sshd
sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@www ~]# service sshd start
[root@www ~]# service sshd stop
3、OpenSSh服务的配置文件:
[root@www ~]# ll /etc/ssh
总用量 184
-rw------- 1 root root 111892 2007-08-08 moduli
-rw-r--r-- 1 root root 1417 2007-08-08 ssh_config //客户端的配置文件,当作为客户机使用时,ssh命令将按该配置文件的内容进行设置;
-rw------- 1 root root 3025 2007-08-08 sshd_config //服务器端的配置文件,服务端启动时会按照此配置文件的内容进行设置;
-rw------- 1 root root 668 1月 14 01:14 ssh_host_dsa_key //私钥;
-rw-r--r-- 1 root root 590 1月 14 01:14 ssh_host_dsa_key.pub //公钥
-rw------- 1 root root 515 1月 14 01:14 ssh_host_key
-rw-r--r-- 1 root root 319 1月 14 01:14 ssh_host_key.pub
-rw------- 1 root root 887 1月 14 01:14 ssh_host_rsa_key
-rw-r--r-- 1 root root 210 1月 14 01:14 ssh_host_rsa_key.pub
4、基于口令的客户端登陆(客户端用服务器端已存在的账号登陆到服务器):
[root@www ~]# iptables -I INPUT 1 -p tcp -s 192.168.100.1 --dport 22 -j ACCEPT //在服务器端的防火墙插入一条策略规则,即时生效。
[root@lwh ~]# ssh tel@192.168.100.1
The authenticity of host '192.168.100.1 (192.168.100.1)' can't be established.
RSA key fingerprint is b6:0d:d5:77:4f:be:2e:46:90:59:44:6e:ba:52:1c:3b.
Are you sure you want to continue connecting (yes/no)? yes //客户端首次登陆时需要在服务器端下载一个RSA密钥到本地的“/用户主目录/.ssh”文件夹里;
tel@192.168.100.2's password: //并要求输入服务器上tel用户的密码;
[tel@www ~]$
5、SSH的用户目录:
[root@lwh ~]# ls .ssh/
known_hosts //该文件用于保存当前用户登陆过的所有的SSH服务器的RSA密钥,这些密钥都是用户在第一次登陆SSh服务器时,用输入yes时保存下来的。
6、基于密钥的客户端登陆:
[root@www ~]# iptables -I INPUT 1 -p tcp -s 192.168.100.1 --dport 22 -j ACCEPT //同样,在服务器端的防火墙插入一条策略规则。
①、创建用户用于SSH登陆:
[root@lwh ~]# useradd sshuser
[root@lwh ~]# passwd sshuser
②、在客户端生成公钥和私钥对:
[root@lwh ~]# su - sshuser //切换用户;
[sshuser@lwh ~]$ pwd //用户当前路径;
/home/sshuser
[sshuser@lwh ~]$ ssh-keygen -t rsa //生成公钥和私钥对;
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sshuser/.ssh/id_rsa):
Created directory '/home/sshuser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sshuser/.ssh/id_rsa.
Your public key has been saved in /home/sshuser/.ssh/id_rsa.pub.
The key fingerprint is:
0c:8d:9e:99:b5:95:32:70:96:6e:1c:38:71:57:4d:cb sshuser@lwh.com
[sshuser@lwh ~]$ ll .ssh/ //查看生成的密钥文件;
总用量 16
-rw------- 1 sshuser sshuser 883 2月 5 17:22 id_rsa
-rw-r--r-- 1 sshuser sshuser 225 2月 5 17:22 id_rsa.pub
③、将生成的公钥“id_rsa.pub”复制并改名添加到SSH服务器“/想要登陆的账号/.ssh/authorized_keys”
//在SSH服务器相应的目录下新建“.ssh”目录:
[root@www ~]# mkdir /root/.ssh/
//在SSH客户端,用scp命令进行复制:
[sshuser@lwh ~]$ scp ~/.ssh/id_rsa.pub root@192.168.100.2:~/.ssh/authorized_keys //注意登陆的用户名,拷贝到那个宿主目录下,就在客户端以哪个账号登陆;
The authenticity of host '192.168.100.2 (192.168.100.2)' can't be established.
RSA key fingerprint is fe:88:0f:f6:ac:d4:76:9a:ef:4b:16:28:37:36:ec:93.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.2' (RSA) to the list of known hosts.
root@192.168.100.2's password:
id_rsa.pub 100% 225 0.2KB/s 00:00
④、在客户端登陆:
[sshuser@lwh ~]$ ssh root@192.168.100.2
Last login: Thu Feb 5 17:17:49 2009 from linserv //并没有提示要输入密码;
[root@www ~]#
7、其他设置:
//不允许以root账号登陆服务器在服务器端:
[root@www ~]# vi /etc/ssh/sshd_config
PermitRootLogin no //在配置文件中加入;
[root@www ~]# service sshd restart
//再次登陆:
[root@lwh ~]# su - sshuser //sshuser是创建的用于ssh登陆的账号;
[sshuser@lwh ~]$ ssh root@192.168.100.2
root@192.168.100.2's password: //输入密码;
Permission denied, please try again. //提示权限拒绝,可以通过使用普通账号登陆服务器后再切换到root账号来实现远程管理的目的;
root@192.168.100.2's password:
天天都在面对电脑,就是防护措施作得再好,也还是会,不过这些真的
多谢您的分享~! 嘿嘿
元旦结束了,马上就要到新年了,提前祝大家新年快乐!
多吃一些胡萝卜、豆芽、西红柿、瘦肉、动物肝等富含维生素A、C和蛋白
Powered by Bitrac, Designed by Loveyuki, Icon by Led Icon Set. 京ICP备05033602号