关于kill -0 pid的作用详解

系统 Linux
在服务器运维以及程序开发过程中,经常会用到kill命令或者kill()方法。那么,kill是做什么以及信号0的作用又是什么,一起来探寻吧。

[[402074]]

在服务器运维以及程序开发过程中,经常会用到kill命令或者kill()方法。那么,kill是做什么以及信号0的作用又是什么,一起来探寻吧。

kill可以使用的信号

  1. [root@localhost ~]# kill -l 
  2.  1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP 
  3.  6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1 
  4. 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 
  5. 16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 
  6. 21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ 
  7. 26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR 
  8. 31) SIGSYS   
  9. 34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3 
  10. 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 
  11. 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 
  12. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 
  13. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7 
  14. 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 
  15. 63) SIGRTMAX-1  64) SIGRTMAX 

 注意:

下面内容常作为面试题:前31个信号和后31个信号的区别?

在Linux上执行kill -l看到可使用信号共有62个(仔细看没有32、33哦)。

  • 编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的)
  • 编号为34 ~ 64的信号是后来扩充的,称做可靠信号(实时信号)

不可靠信号、可靠信号区别:前者不支持排队,可能会造成信号丢失,而后者不会。

kill的文档描述

通过man命令可以看到关于kill指令的描述以及参数解释,这里截取部分描述,如下:

  1. [root@localhost ~]# man 1 kill 
  2.  
  3. KILL(1)                                                                      User Commands                                                                      KILL(1) 
  4.  
  5. NAME 
  6.        kill - terminate a process 
  7.  
  8. SYNOPSIS 
  9.        kill [-s signal|-p] [-q sigval] [-a] [--] pid... 
  10.        kill -l [signal] 
  11.  
  12. DESCRIPTION 
  13.        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 
  14.        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. 
  15.  
  16.        Most modern shells have a builtin kill functionwith a usage rather similar to that of the command described here.  The '-a' and '-p' options, and  the  possi‐ 
  17.        bility to specify processes by command name are a local extension. 
  18.  
  19.        If sig is 0, then no signal is sent, but error checking is still performed. 
  20.        ...... 
  21.         
  22.  
  23. # [root@localhost ~]# man 2 kill 
  24. KILL(2)                                                                Linux Programmer's Manual                                                                KILL(2) 
  25.  
  26. NAME 
  27.        kill - send signal to a process 
  28.  
  29. SYNOPSIS 
  30.        #include <sys/types.h> 
  31.        #include <signal.h> 
  32.  
  33.        int kill(pid_t pid, int sig); 
  34.  
  35.    Feature Test Macro Requirements for glibc (see feature_test_macros(7)): 
  36.  
  37.        kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE 
  38.  
  39. DESCRIPTION 
  40.        The kill() system call can be used to send any signal to any process group or process. 
  41.  
  42.        If pid is positive, then signal sig is sent to the process with the ID specified by pid. 
  43.  
  44.        If pid equals 0, then sig is sent to every process in the process group of the calling process. 
  45.  
  46.        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. 
  47.  
  48.        If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid. 
  49.  
  50.        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. 
  51.  
  52.        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 
  53.        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 
  54.        belong to the same session. 

 从描述可知,无论是man 1文档还是man 2文档都指出:kill命令用于向指定的pid进程发送信号,进程在接收到对应的信号之后会进行对应的操作。

关于信号0的作用

man 1 文档中有一句 If sig is 0, then no signal is sent, but error checking is still performed, 意思是:如果sig为0,则不发送信号,但仍然进行错误检查。

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,则不发送信号,但仍然进行错误检查; 这可以用来检查是否存在进程ID或进程组ID。

也就是说,kill -0 pid 执行时不会发送信号,但是会对pid对应进程做错误检查。如果返回0则进程、服务正在运行中;反之是其他值,则进程死了或者服务已停止。

信号0的用法

既然,信号kill -0 pid不发送信号,主要用于检查对应进程做错误检查。那么,在开发中我们就可以通过kill返回的错误信息来判断进程是否存在、正常运行。

shell脚本中示例:

  1. #!/bin/bash 
  2.  
  3. PIDFILE=$1 
  4.  
  5. if [ -f $PIDFILE ]; then 
  6.       PID="$(cat $PIDFILE)" 
  7.      
  8.     if kill -0 "$PID" &> /dev/nullthen 
  9.       echo "process is exists" 
  10.       exit 0 
  11.     else 
  12.       echo "process is not exists" 
  13.       exit 5 
  14.     fi 
  15. fi 

 Go代码中示例:

  1. func processExists(pid int) bool { 
  2.     if err := syscall.Kill(pid, 0); err == nil { 
  3.         return true 
  4.     } else { 
  5.         return false 
  6.     } 

 【编辑推荐】

 

责任编辑:姜华 来源: 今日头条
相关推荐

2010-06-04 14:49:15

Linux 查看进程

2024-10-22 16:54:14

2020-09-26 07:19:46

Java

2024-08-13 15:46:57

2024-08-26 15:13:36

2012-05-14 10:18:54

jQuery

2024-10-11 17:13:14

SQL数据库查询数据库

2011-03-18 09:27:00

Spring

2014-11-06 10:46:48

CloudFoundr

2014-11-06 09:49:22

CloudFoundrPaaS

2010-09-27 13:21:02

DHCP作用域

2010-09-01 09:10:30

DHCP作用域

2022-04-14 11:17:41

MySQL字符配置

2014-06-05 17:02:41

FTP

2011-09-09 16:23:16

Android Web测试

2024-10-17 16:17:21

MySQL临时表数据库

2009-10-16 13:19:41

布线施工要求

2024-11-21 07:00:00

线程池Java开发

2021-07-01 11:56:51

JavaScript开发代码

2009-09-01 17:59:36

C#泛型的作用
点赞
收藏

51CTO技术栈公众号