系统中能够识别的信号较多,咱们可使用命令"kill -l"或"man 7 signal"来查询。命令以下:apache
[root@localhost ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
常见的进程信号最重要的就是 "1"、"9"、"15"这三个信号 bash
信号代号 | 信号名称 | 说 明 |
---|---|---|
1 | SIGHUP | 该信号让进程当即关闭.而后从新读取配置文件以后重启 |
2 | SIGINT | 程序停止信号,用于停止前台进程。至关于输出 Ctrl+C 快捷键 |
8 | SIGFPE | 在发生致命的算术运算错误时发出。不只包括浮点运算错误,还包括溢出及除数为 0 等其余全部的算术运算错误 |
9 | SIGKILL | 用来当即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制停止进程 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。ssh 若是进程已经发生了问题,那么这个信号是没法正常停止进程的,这时咱们才会尝试 SIGKILL信号(信号 9) 函数 |
18 | SIGCONT | 该信号可让暂停的进程恢复执行。本信号不能被阻断 |
19 | SIGSTOP | 该信号能够暂停前台进程,至关于输入 Ctrl+Z 快捷键。本信号不能被阻断 |
kill是用来杀死进程的命令。能够根据不一样的信号,kill 命令能够完成不一样的操做,默认信号是15,正常中止。kill 命令格式以下:spa
[root@localhost ~]# kill [信号] PID
kill 命令是按照 PID 来肯定进程的,因此 kill 命令只能识别 PID,而不能识别进程名。咱们举几个例子来讲明一下 kill 命令。code
[root@localhost ~]# kill -1 进程号
[root@localhost ~]# kill -19 进程号
killall 命令再也不依靠 PID 来杀死单个进程,而是经过程序的进程名来杀死一类进程。命令格式以下:blog
[root@localhost ~]# killall [选项] [信号] 进程名
选项:进程
#启动RPM包默认安装的apache服务 [root@localhost ~]# service httpd start #查看httpd进程 [root@localhost ~]# ps aux | grep "httpd" | grep -v "grep" root 1600 0.0 0.2 4520 1696? Ss 19:42 0:00 /usr/local/apache2/bin/httpd -k start daemon 1601 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start daemon 1602 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start daemon 1603 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start daemon 1604 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start daemon 1605 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start #杀死全部进程名是httpd的进程 [root@localhost ~]# killall httpd #查询发现全部的httpd进程都消失了 [root@localhost ~]# ps aux | grep "httpd" | grep -v "grep"
#查询系统中有3个sshd进程。1733是sshd服务的进程,1735和1758是两个远程链接的进程 [root@localhost ~]# ps aux | grep "sshd" | grep -v "grep" root 1733 0.0 0.1 8508 1008? Ss 19:47 0:00/usr/sbin/sshd root 1735 0.1 0.5 11452 3296? Ss 19:47 0:00 sshd: root@pts/0 root 1758 0.1 0.5 11452 3296? Ss 19:47 0:00 sshd: root@pts/1 #交互式杀死sshd进程 [root@localhost ~]# killall -i sshd #这个进程是sshd的服务进程,若是杀死,那么全部的sshd链接都不能登录 杀死sshd(1733)?(y/N)n #这是当前登陆终端,不能杀死我本身吧 杀死 sshd(1735)?(y/N)n #杀死另外一个sshd登录终端 杀死 sshd(1758)?(y/N)y
pkill 命令和 killall 命令很是相似,也是按照进程名来杀死进程的。命令格式以下:table
[root@localhost ~]# pkill [选项] [信号] 进程名
选项:class
不过 pkill 命令能够按照终端号来踢出用户。不知道你们发现没有,刚刚经过 killall 命令杀死 sshd 进程的方式来踢出用户,很是容易误杀死进程,要么会把 sshd 服务杀死,要么会把本身的登陆终端杀死。
因此,不论是使用 kill 命令按照 PID 杀死登陆进程,仍是使用 killall 命令按照进程名杀死登陆进程,都是很是容易误杀死进程的。 具体命令以下:
#使用w命令査询本机已经登陆的用户 [root@localhost ~]# w 20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root ttyl - 19:47 18:52 0.01s 0.01s -bash root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash #当前主机已经登陆了三个root用户,一个是本地终端ttyl登陆,另外两个是从192.168.0.100登录的远程登陆 #强制杀死从pts/1虚拟终端登录的进程 [root@localhost ~]# pkill -9 -t pts/1 #虚拟终端pts/1的登陆进程已经被杀死了 [root@localhost ~]# w 20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root ttyl - 19:47 21:27 0.01s 0.01s -bash root pts/0 192.168.0.100 19:47 0.00s 0.06s 0.00s w