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 -9999 is an invalid signal
198 case $SH in dash) exit ;; esac
199 sleep 0.1 &
200 pid=$!
201 kill -9999 $pid > /dev/null
202 echo kill=$?
203
204 wait $pid
205 echo wait=$?
206 ## STDOUT:
207 kill=1
208 wait=0
209 ## N-I dash STDOUT:
210 ## END
211
212 #### kill -15 %% kills current job
213 #case $SH in mksh|dash) exit ;; esac
214
215 sleep 0.5 &
216 pid=$!
217 kill -15 %%
218 echo kill=$?
219
220 wait %%
221 echo wait=$?
222
223 # no such job
224 wait %%
225 echo wait=$?
226
227 ## STDOUT:
228 kill=0
229 wait=143
230 wait=127
231 ## END
232 ## OK zsh STDOUT:
233 kill=0
234 wait=143
235 wait=1
236 ## END
237 ## N-I dash STDOUT:
238 kill=1
239 wait=0
240 wait=0
241 ## END
242 ## BUG mksh STDOUT:
243 kill=0
244 wait=0
245 wait=127
246 ## END
247
248 #### kill -15 %- kills previous job
249 #case $SH in mksh|dash) exit ;; esac
250
251 sleep 0.1 & # previous job
252 sleep 0.2 & # current job
253
254 kill -15 %-
255 echo kill=$?
256
257 wait %-
258 echo wait=$?
259
260 # what does bash define here as the previous job? May be a bug
261 #wait %-
262 #echo wait=$?
263 ## STDOUT:
264 kill=0
265 wait=143
266 ## END
267 ## BUG mksh STDOUT:
268 kill=0
269 wait=0
270 ## BUG dash STDOUT:
271 kill=1
272 wait=0
273 ## END
274 ## BUG zsh STDOUT:
275 kill=0
276 wait=1
277 ## END
278
279
280 #### kill multiple pids at once
281 sleep 0.1 &
282 pid1=$!
283 sleep 0.1 &
284 pid2=$!
285 sleep 0.1 &
286 pid3=$!
287
288 kill $pid1 $pid2 $pid3
289 echo $?
290 ## STDOUT:
291 0
292 ## END
293
294 #### kill pid and job at once
295 sleep 0.1 &
296 pid=$!
297 sleep 0.1 &
298 kill %2 $pid
299 echo $?
300 ## STDOUT:
301 0
302 ## BUG dash STDOUT:
303 1
304 ## END
305
306 #### Numeric signal out of range - OSH may send it anyway
307
308 sleep 0.1 &
309
310 # OSH doesn't validate this, but that could be useful for non-portable signals,
311 # which we don't have a name for.
312
313 kill -s 9999 %%
314 echo kill=$?
315
316 wait
317 echo wait=$?
318
319 ## STDOUT:
320 kill=1
321 wait=0
322 ## END
323
324 ## OK dash STDOUT:
325 kill=2
326 wait=0
327 ## END