1 ## oils_failures_allowed: 2
2 ## compare_shells: dash bash mksh
3 # note: zsh 5.9 passes more tests
4
5 # Tests for builtins having to do with killing a process
6
7 #### kill -15 kills the process with SIGTERM
8 case $SH in mksh) exit ;; esac # mksh is flaky
9
10 sleep 0.1 &
11 pid=$!
12 kill -15 $pid
13 echo kill=$?
14
15 wait $pid
16 echo wait=$? # 143 is 128 + SIGTERM
17 ## STDOUT:
18 kill=0
19 wait=143
20 ## END
21 ## BUG mksh STDOUT:
22 ## END
23
24 #### kill -KILL kills the process with SIGKILL
25 sleep 0.1 &
26 pid=$!
27 kill -KILL $pid
28 echo kill=$?
29
30 wait $pid
31 echo wait=$? # 137 is 128 + SIGKILL
32 ## STDOUT:
33 kill=0
34 wait=137
35 ## END
36
37 #### kill -n 9 specifies the signal number
38 #case $SH in mksh|dash) exit ;; esac
39
40 sleep 0.1 &
41 pid=$!
42 kill -n 9 $pid
43 echo kill=$?
44
45 wait $pid
46 echo wait=$?
47 ## STDOUT:
48 kill=0
49 wait=137
50 ## END
51 ## N-I dash STDOUT:
52 kill=2
53 wait=0
54 ## END
55 ## N-I mksh STDOUT:
56 kill=1
57 wait=0
58 ## END
59
60 #### kill -s TERM specifies the signal name
61 sleep 0.1 &
62 pid=$!
63 kill -s TERM $pid
64 echo kill=$?
65
66 wait $pid
67 echo wait=$?
68 ## STDOUT:
69 kill=0
70 wait=143
71 ## END
72 ## BUG mksh STDOUT:
73 kill=0
74 wait=0
75 ## END
76
77 #### kill -terM -SigterM isn't case sensitive
78 case $SH in mksh|dash|zsh) exit ;; esac
79
80 sleep 0.1 &
81 pid=$!
82 kill -SigterM $pid
83 echo kill=$?
84 wait $pid
85 echo wait=$?
86
87 sleep 0.1 &
88 pid=$!
89 kill -terM $pid
90 echo kill=$?
91 wait $pid
92 echo wait=$?
93
94 ## STDOUT:
95 kill=0
96 wait=143
97 kill=0
98 wait=143
99 ## N-I dash/mksh/zsh STDOUT:
100 ## END
101
102 #### kill HUP pid gives the correct error
103 case $SH in dash) exit ;; esac
104 sleep 0.1 &
105 builtin kill HUP $pid
106 echo $?
107
108 ## STDOUT:
109 1
110 ## OK osh STDOUT:
111 2
112 ## END
113 ## N-I dash STDOUT:
114 ## END
115 #### kill -l shows signals
116 case $SH in dash) exit ;; esac
117
118 # Check if at least the HUP flag is reported. The output format of all shells
119 # is different and the available signals may depend on your environment
120
121 builtin kill -l | grep HUP > /dev/null
122 echo $?
123 ## STDOUT:
124 0
125 ## N-I dash STDOUT:
126 ## END
127
128 #### kill -L also shows signals
129 case $SH in mksh|dash|zsh) exit ;; esac
130
131 builtin kill -L | grep HUP > /dev/null
132 echo $?
133 ## STDOUT:
134 0
135 ## N-I mksh/dash/zsh STDOUT:
136 ## END
137
138 #### kill -l 10 TERM translates between names and numbers
139 case $SH in mksh|dash) exit ;; esac
140
141 builtin kill -l 10 11 12
142 echo status=$?
143 echo
144
145 builtin kill -l SIGUSR1 SIGSEGV USR2
146 echo status=$?
147 echo
148
149 # mixed kind
150 builtin kill -l 10 SIGSEGV 12
151 echo status=$?
152 echo
153
154 ## STDOUT:
155 USR1
156 SEGV
157 USR2
158 status=0
159
160 10
161 11
162 12
163 status=0
164
165 USR1
166 11
167 USR2
168 status=0
169
170 ## N-I dash/mksh STDOUT:
171 ## END
172
173 #### kill -L checks for invalid input
174 case $SH in mksh|dash) exit ;; esac
175
176 builtin kill -L 10 BAD 12
177 echo status=$?
178 echo
179
180 builtin kill -L USR1 9999 USR2
181 echo status=$?
182 echo
183
184 ## STDOUT:
185 USR1
186 USR2
187 status=1
188
189 10
190 12
191 status=1
192
193 ## END
194 ## N-I dash/mksh STDOUT:
195 ## END
196
197 #### kill -l with exit code
198 kill -l 134 # 128 + 6 (ABRT)
199 ## STDOUT:
200 ABRT
201 ## END
202
203 #### kill -l with 128 is invalid
204 kill -l 128
205 if [ $? -ne 0 ]; then
206 echo "invalid"
207 fi
208 ## STDOUT:
209 invalid
210 ## N-I mksh STDOUT:
211 128
212 ## END
213
214 #### kill -l 0 returns EXIT
215 kill -l 0
216 ## STDOUT:
217 EXIT
218 ## N-I dash status: 2
219 ## N-I dash STDOUT:
220 ## N-I mksh STDOUT:
221 0
222 ## END
223
224 #### kill -9999 is an invalid signal
225 case $SH in dash) exit ;; esac
226 sleep 0.1 &
227 pid=$!
228 kill -9999 $pid > /dev/null
229 echo kill=$?
230
231 wait $pid
232 echo wait=$?
233 ## STDOUT:
234 kill=1
235 wait=0
236 ## N-I dash STDOUT:
237 ## END
238
239 #### kill -15 %% kills current job
240 #case $SH in mksh|dash) exit ;; esac
241
242 sleep 0.5 &
243 pid=$!
244 kill -15 %%
245 echo kill=$?
246
247 wait %%
248 echo wait=$?
249
250 # no such job
251 wait %%
252 echo wait=$?
253
254 ## STDOUT:
255 kill=0
256 wait=143
257 wait=127
258 ## END
259 ## OK zsh STDOUT:
260 kill=0
261 wait=143
262 wait=1
263 ## END
264 ## N-I dash STDOUT:
265 kill=1
266 wait=0
267 wait=0
268 ## END
269 ## BUG mksh STDOUT:
270 kill=0
271 wait=0
272 wait=127
273 ## END
274
275 #### kill -15 %- kills previous job
276 #case $SH in mksh|dash) exit ;; esac
277
278 sleep 0.1 & # previous job
279 sleep 0.2 & # current job
280
281 kill -15 %-
282 echo kill=$?
283
284 wait %-
285 echo wait=$?
286
287 # what does bash define here as the previous job? May be a bug
288 #wait %-
289 #echo wait=$?
290 ## STDOUT:
291 kill=0
292 wait=143
293 ## END
294 ## BUG mksh STDOUT:
295 kill=0
296 wait=0
297 ## BUG dash STDOUT:
298 kill=1
299 wait=0
300 ## END
301 ## BUG zsh STDOUT:
302 kill=0
303 wait=1
304 ## END
305
306
307 #### kill multiple pids at once
308 sleep 0.1 &
309 pid1=$!
310 sleep 0.1 &
311 pid2=$!
312 sleep 0.1 &
313 pid3=$!
314
315 kill $pid1 $pid2 $pid3
316 echo $?
317 ## STDOUT:
318 0
319 ## END
320
321 #### kill pid and job at once
322 sleep 0.1 &
323 pid=$!
324 sleep 0.1 &
325 kill %2 $pid
326 echo $?
327 ## STDOUT:
328 0
329 ## BUG dash STDOUT:
330 1
331 ## END
332
333 #### Numeric signal out of range - OSH may send it anyway
334
335 sleep 0.1 &
336
337 # OSH doesn't validate this, but that could be useful for non-portable signals,
338 # which we don't have a name for.
339
340 kill -s 9999 %%
341 echo kill=$?
342
343 wait
344 echo wait=$?
345
346 ## STDOUT:
347 kill=1
348 wait=0
349 ## END
350
351 ## OK dash STDOUT:
352 kill=2
353 wait=0
354 ## END