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 -l 0 INT lists both signals
225 kill -l 0 INT
226 ## STDOUT:
227 EXIT
228 2
229 ## N-I dash status: 2
230 ## N-I dash STDOUT:
231 ## N-I mksh status: 1
232 ## N-I mksh STDOUT:
233 0
234 ## END
235
236 #### kill -9999 is an invalid signal
237 case $SH in dash) exit ;; esac
238 sleep 0.1 &
239 pid=$!
240 kill -9999 $pid > /dev/null
241 echo kill=$?
242
243 wait $pid
244 echo wait=$?
245 ## STDOUT:
246 kill=1
247 wait=0
248 ## N-I dash STDOUT:
249 ## END
250
251 #### kill -15 %% kills current job
252 #case $SH in mksh|dash) exit ;; esac
253
254 sleep 0.5 &
255 pid=$!
256 kill -15 %%
257 echo kill=$?
258
259 wait %%
260 echo wait=$?
261
262 # no such job
263 wait %%
264 echo wait=$?
265
266 ## STDOUT:
267 kill=0
268 wait=143
269 wait=127
270 ## END
271 ## OK zsh STDOUT:
272 kill=0
273 wait=143
274 wait=1
275 ## END
276 ## N-I dash STDOUT:
277 kill=1
278 wait=0
279 wait=0
280 ## END
281 ## BUG mksh STDOUT:
282 kill=0
283 wait=0
284 wait=127
285 ## END
286
287 #### kill -15 %- kills previous job
288 #case $SH in mksh|dash) exit ;; esac
289
290 sleep 0.1 & # previous job
291 sleep 0.2 & # current job
292
293 kill -15 %-
294 echo kill=$?
295
296 wait %-
297 echo wait=$?
298
299 # what does bash define here as the previous job? May be a bug
300 #wait %-
301 #echo wait=$?
302 ## STDOUT:
303 kill=0
304 wait=143
305 ## END
306 ## BUG mksh STDOUT:
307 kill=0
308 wait=0
309 ## BUG dash STDOUT:
310 kill=1
311 wait=0
312 ## END
313 ## BUG zsh STDOUT:
314 kill=0
315 wait=1
316 ## END
317
318
319 #### kill multiple pids at once
320 sleep 0.1 &
321 pid1=$!
322 sleep 0.1 &
323 pid2=$!
324 sleep 0.1 &
325 pid3=$!
326
327 kill $pid1 $pid2 $pid3
328 echo $?
329 ## STDOUT:
330 0
331 ## END
332
333 #### kill pid and job at once
334 sleep 0.1 &
335 pid=$!
336 sleep 0.1 &
337 kill %2 $pid
338 echo $?
339 ## STDOUT:
340 0
341 ## BUG dash STDOUT:
342 1
343 ## END
344
345 #### Numeric signal out of range - OSH may send it anyway
346
347 sleep 0.1 &
348
349 # OSH doesn't validate this, but that could be useful for non-portable signals,
350 # which we don't have a name for.
351
352 kill -s 9999 %%
353 echo kill=$?
354
355 wait
356 echo wait=$?
357
358 ## STDOUT:
359 kill=1
360 wait=0
361 ## END
362
363 ## OK dash STDOUT:
364 kill=2
365 wait=0
366 ## END