1 | kill
|
2 | ===
|
3 |
|
4 | 发送信号到进程。
|
5 |
|
6 | ## 目录
|
7 |
|
8 | - [bash内建命令](#内建命令)
|
9 | - [GNU coreutils中的命令](#外部命令)
|
10 |
|
11 | ## 内建命令
|
12 |
|
13 | #### 概要
|
14 |
|
15 | ```shell
|
16 | kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
|
17 | kill -l [sigspec]
|
18 | ```
|
19 |
|
20 | #### 主要用途
|
21 |
|
22 | - 发送信号到作业或进程(可以为多个)。
|
23 | - 列出信号。
|
24 |
|
25 | #### 选项
|
26 |
|
27 | ```shell
|
28 | -s sig 信号名称。
|
29 | -n sig 信号名称对应的数字。
|
30 | -l 列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。
|
31 | -L 等价于-l选项。
|
32 | ```
|
33 |
|
34 | #### 参数
|
35 |
|
36 | pid:进程ID
|
37 |
|
38 | jobspec:作业标识符
|
39 |
|
40 | #### 返回值
|
41 |
|
42 | 返回状态为成功除非给出了非法选项、执行出现错误。
|
43 |
|
44 | #### 例子
|
45 |
|
46 | ```shell
|
47 | [user2@pc] kill -l 9
|
48 | KILL
|
49 |
|
50 | # 列出所有信号名称:
|
51 | [user2@pc] kill -l
|
52 | 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
|
53 | 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
|
54 | 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
|
55 | 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
|
56 | 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
|
57 | 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
|
58 | 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
|
59 | 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
|
60 | 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
|
61 | 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
|
62 | 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
|
63 | 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
|
64 | 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
|
65 | 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
|
66 | 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
|
67 | 63) SIGRTMAX-1 64) SIGRTMAX
|
68 |
|
69 | # 下面是常用的信号。
|
70 | # 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。
|
71 |
|
72 | HUP 1 终端挂断
|
73 | INT 2 中断(同 Ctrl + C)
|
74 | QUIT 3 退出(同 Ctrl + \)
|
75 | KILL 9 强制终止
|
76 | TERM 15 终止
|
77 | CONT 18 继续(与STOP相反,fg/bg命令)
|
78 | STOP 19 暂停(同 Ctrl + Z)
|
79 | ```
|
80 |
|
81 | ```shell
|
82 | # 以下发送KILL信号的形式等价。当然还有更多的等价形式,在此不一一列举了。
|
83 | [user2@pc] kill -s SIGKILL PID
|
84 | [user2@pc] kill -s KILL PID
|
85 | [user2@pc] kill -n 9 PID
|
86 | [user2@pc] kill -9 PID
|
87 |
|
88 | [user2@pc] sleep 90 &
|
89 | [1] 178420
|
90 |
|
91 | # 终止作业标识符为1的作业。
|
92 | [user2@pc] kill -9 %1
|
93 |
|
94 | [user2@pc] jobs -l
|
95 | [1]+ 178420 KILLED ssh 192.168.1.4
|
96 |
|
97 | [user2@pc] sleep 90 &
|
98 | [1] 181357
|
99 |
|
100 | # 发送停止信号。
|
101 | [user2@pc] kill -s STOP 181357
|
102 |
|
103 | [user2@pc] jobs -l
|
104 | [1]+ 181537 Stopped (signal) sleep 90
|
105 |
|
106 | # 发送继续信号。
|
107 | [user2@pc] kill -s CONT 181357
|
108 |
|
109 | [user2@pc] jobs -l
|
110 | [1]+ 181537 Running sleep 90 &
|
111 | ```
|
112 |
|
113 | #### 注意
|
114 |
|
115 | 1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。
|
116 | 2. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
|
117 |
|
118 |
|
119 | ## 外部命令
|
120 |
|
121 | #### 概要
|
122 |
|
123 | ```shell
|
124 | kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
|
125 | kill -l [number] | -L
|
126 | ```
|
127 |
|
128 | #### 主要用途
|
129 |
|
130 | - 发送信号到进程(可以为多个)。
|
131 |
|
132 | - 列出信号。
|
133 |
|
134 | #### 选项
|
135 |
|
136 | ```shell
|
137 | -s, --signal signal 要发送的信号,可能是信号名称或信号对应的数字。
|
138 | -l, --list [number] 打印信号名称或转换给定数字到信号名称。信号名称可参考文件(/usr/include/linux/signal.h)。
|
139 | -L, --table 和'-l'选项类似,但是输出信号名称以及信号对应的数字。
|
140 | -a, --all 不要限制“命令名到pid”的转换为具有与当前进程相同的UID的进程。
|
141 | -p, --pid 打印目标进程的PID而不发送信号。
|
142 | --verbose 打印信号以及接收信号的PID。
|
143 | -q, --queue value 使用sigqueue(3)而不是kill(2)。参数value是信号对应的数字。
|
144 | 如果接收进程已为此信号安装了处理程序将SA_SIGINFO标记为sigaction(2),则可以获取
|
145 | 该数据通过siginfo_t结构的si_sigval字段。
|
146 | --help 显示帮助信息并退出。
|
147 | --version 显示版本信息并退出。
|
148 | ```
|
149 |
|
150 | #### 参数
|
151 |
|
152 | 接收信号的进程列表可以是PID以及name的混合组成。
|
153 |
|
154 | PID:每一个PID可以是以下四种情况之一:
|
155 |
|
156 | 状态|说明
|
157 | :--:|:--:
|
158 | n | 当n大于0时,PID为n的进程接收信号。
|
159 | 0 | 当前进程组中的所有进程均接收信号。
|
160 | -1 | PID大于1的所有进程均接收信号。
|
161 | -n | 当n大于1时,进程组n中的所有进程接收信号。当给出了一个参数的形式为“-n”,想要让它表示一个进程组,那么必须首先指定一个信号,或参数前必须有一个“--”选项,否则它将被视为发送的信号。
|
162 |
|
163 | name:使用此名称调用的所有进程将接收信号。
|
164 |
|
165 | #### 例子
|
166 |
|
167 | ```shell
|
168 | > sleep 20 &
|
169 |
|
170 | # 列出对应的PID。
|
171 | > kill -p sleep
|
172 | 23021
|
173 | ```
|
174 |
|
175 | #### 返回值
|
176 |
|
177 | - 0 成功。
|
178 | - 1 失败。
|
179 | - 64 部分成功(当指定了多个进程时)。
|
180 |
|
181 | #### 注意
|
182 |
|
183 | 1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 kill`或`info coreutils 'kill invocation'`。
|
184 | 2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。
|
185 | 3. 与`kill`命令类似的有`xkill`,`pkill`,`killall`等,用于不同的目的和场景。
|
186 |
|
187 | #### 参考链接
|
188 | [发送信号到进程](https://bash.cyberciti.biz/guide/Sending_signal_to_Processes)
|
189 |
|
190 |
|