關(guān)于kill -0 pid的作用詳解
在服務(wù)器運(yùn)維以及程序開發(fā)過(guò)程中,經(jīng)常會(huì)用到kill命令或者kill()方法。那么,kill是做什么以及信號(hào)0的作用又是什么,一起來(lái)探尋吧。
kill可以使用的信號(hào)
- [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
注意:
下面內(nèi)容常作為面試題:前31個(gè)信號(hào)和后31個(gè)信號(hào)的區(qū)別?
在Linux上執(zhí)行kill -l看到可使用信號(hào)共有62個(gè)(仔細(xì)看沒(méi)有32、33哦)。
- 編號(hào)為1 ~ 31的信號(hào)為傳統(tǒng)UNIX支持的信號(hào),是不可靠信號(hào)(非實(shí)時(shí)的)
- 編號(hào)為34 ~ 64的信號(hào)是后來(lái)擴(kuò)充的,稱做可靠信號(hào)(實(shí)時(shí)信號(hào))
不可靠信號(hào)、可靠信號(hào)區(qū)別:前者不支持排隊(duì),可能會(huì)造成信號(hào)丟失,而后者不會(huì)。
kill的文檔描述
通過(guò)man命令可以看到關(guān)于kill指令的描述以及參數(shù)解釋,這里截取部分描述,如下:
- [root@localhost ~]# man 1 kill
- KILL(1) User Commands KILL(1)
- NAME
- kill - terminate a process
- SYNOPSIS
- kill [-s signal|-p] [-q sigval] [-a] [--] pid...
- kill -l [signal]
- DESCRIPTION
- The command kill sends the specified signal to the specified process or process group. If no signal is specified, the TERM signal is sent. The TERM signal
- will kill processes which do not catch this signal. For other processes, it may be necessary to use the KILL (9) signal, since this signal cannot be caught.
- Most modern shells have a builtin kill function, with a usage rather similar to that of the command described here. The '-a' and '-p' options, and the possi‐
- bility to specify processes by command name are a local extension.
- If sig is 0, then no signal is sent, but error checking is still performed.
- ......
- # [root@localhost ~]# man 2 kill
- KILL(2) Linux Programmer's Manual KILL(2)
- NAME
- kill - send signal to a process
- SYNOPSIS
- #include <sys/types.h>
- #include <signal.h>
- int kill(pid_t pid, int sig);
- Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
- kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
- DESCRIPTION
- The kill() system call can be used to send any signal to any process group or process.
- If pid is positive, then signal sig is sent to the process with the ID specified by pid.
- If pid equals 0, then sig is sent to every process in the process group of the calling process.
- If pid equals -1, then sig is sent to every process for which the calling process has permission to send signals, except for process 1 (init), but see below.
- If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.
- If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID.
- For a process to have permission to send a signal it must either be privileged (under Linux: have the CAP_KILL capability), or the real or effective user ID of
- the sending process must equal the real or saved set-user-ID of the target process. In the case of SIGCONT it suffices when the sending and receiving processes
- belong to the same session.
從描述可知,無(wú)論是man 1文檔還是man 2文檔都指出:kill命令用于向指定的pid進(jìn)程發(fā)送信號(hào),進(jìn)程在接收到對(duì)應(yīng)的信號(hào)之后會(huì)進(jìn)行對(duì)應(yīng)的操作。
關(guān)于信號(hào)0的作用
man 1 文檔中有一句 If sig is 0, then no signal is sent, but error checking is still performed, 意思是:如果sig為0,則不發(fā)送信號(hào),但仍然進(jìn)行錯(cuò)誤檢查。
man 2 文檔中有一句 If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID,意思是:如果sig為0,則不發(fā)送信號(hào),但仍然進(jìn)行錯(cuò)誤檢查; 這可以用來(lái)檢查是否存在進(jìn)程ID或進(jìn)程組ID。
也就是說(shuō),kill -0 pid 執(zhí)行時(shí)不會(huì)發(fā)送信號(hào),但是會(huì)對(duì)pid對(duì)應(yīng)進(jìn)程做錯(cuò)誤檢查。如果返回0則進(jìn)程、服務(wù)正在運(yùn)行中;反之是其他值,則進(jìn)程死了或者服務(wù)已停止。
信號(hào)0的用法
既然,信號(hào)kill -0 pid不發(fā)送信號(hào),主要用于檢查對(duì)應(yīng)進(jìn)程做錯(cuò)誤檢查。那么,在開發(fā)中我們就可以通過(guò)kill返回的錯(cuò)誤信息來(lái)判斷進(jìn)程是否存在、正常運(yùn)行。
shell腳本中示例:
- #!/bin/bash
- PIDFILE=$1
- if [ -f $PIDFILE ]; then
- PID="$(cat $PIDFILE)"
- if kill -0 "$PID" &> /dev/null; then
- echo "process is exists"
- exit 0
- else
- echo "process is not exists"
- exit 5
- fi
- fi
Go代碼中示例:
- func processExists(pid int) bool {
- if err := syscall.Kill(pid, 0); err == nil {
- return true
- } else {
- return false
- }
- }
【編輯推薦】