summaryrefslogtreecommitdiffstats
path: root/tests/jobs.tests
blob: dacdc15d008b98b33735df1a1a87cc567fe1a301 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# test out %+, jobs -p, and $! agreement in a subshell first
${THIS_SH} ./jobs1.sub

# test out fg/bg failure in a subshell
${THIS_SH} ./jobs2.sub

# test out behavior of waiting for background pids -- bug in versions
# before 2.03
${THIS_SH} ./jobs3.sub

# test out behavior of using job control notation when job control is not
# active
${THIS_SH} ./jobs4.sub

# test out wait -n framework
${THIS_SH} ./jobs5.sub

# test out wait -f framework
${THIS_SH} ./jobs6.sub

${THIS_SH} ./jobs7.sub

jobs
echo $?

# a no-such-job error, since we can use job control notation without job control
wait %1

# make sure we can't fg a job started when job control was not active
sleep 30 &
pid=$!
fg %1
# make sure the killed processes don't cause a message
exec 5>&2
exec 2>/dev/null
kill -n 9 $pid
wait    # make sure we reap the processes while stderr is still redirected
exec 2>&5

echo wait-for-pid
sleep 4 &
wait $!

echo wait-errors
wait 1-1
wait -- -4

echo wait-for-background-pids
sleep 2 &
sleep 4 &
wait

echo async list wait-for-background-pids
sleep 2 & sleep 4 &
wait

echo async list wait for child
sleep 2 & echo forked
wait

echo wait-when-no-children
wait

echo posix jobs output
${THIS_SH} -o posix -c 'sleep 1 & P=$! ; sleep 2; jobs; wait'

set -m

echo wait-for-job
sleep 3 &
wait %2		# this should be a no-such-job error
echo $?
wait %1

echo async list wait-for-job
sleep 2 & echo forked
wait %1

echo fg-bg 1
sleep 2 &
%1

echo fg-bg 2
sleep 2 &
fg %%

echo fg-bg 3
sleep 2 &
fg %s

echo fg-bg 4
sleep 2 &
fg %?ee

# these next two are error cases
echo fg-bg 5
sleep 2 &
fg %2		# this should be a no-such-job error
bg %1		# this should be a `bg background job?' error
wait

# these may someday mean to start the jobs, but not print the line
# describing the status, but for now they are errors
echo fg-bg 6
sleep 2 &
fg -s %1
bg -s %1
wait

# someday this may mean to disown all stopped jobs, but for now it is
# an error
disown -s

# this is an error -- the job with the pid that is the value of $! is
# retained only until a `wait' is performed
disown %1

# this, however, is an error
disown %2

echo wait-for-non-child
wait 1
echo $?

exit 1 | exit 2 | exit 3
echo $? -- ${PIPESTATUS[@]} -- ${PIPESTATUS[0]} - ${PIPESTATUS[1]} - ${PIPESTATUS[2]}

sleep 300 &
sleep300pid=$!
sleep 350 &
sleep 400 &

jobs

echo running jobs:
jobs -r

# should be an error
kill -n 1 %4
# should be an error
jobs %4
echo current job:
jobs %+
echo previous job:
jobs %-

kill -STOP %2
sleep 3	# give time for the shell to get the stop notification
echo after kill -STOP
echo running jobs:
jobs -r
echo stopped jobs:
jobs -s

disown %1

echo after disown
jobs
echo running jobs:
jobs -r
echo stopped jobs:
jobs -s

kill -s CONT %2
echo after kill -s CONT
echo running jobs:
jobs -r
echo stopped jobs:
jobs -s

kill -STOP %3
sleep 3	# give time for the shell to get the stop notification
echo after kill -STOP, backgrounding %3:
bg %3

disown -h %2

# make sure the killed processes don't cause a message
exec 5>&2
exec 2>/dev/null

echo killing...
kill -n 9 $sleep300pid
kill -n 9 %2 %3
wait	# make sure we reap the processes while stderr is still redirected
echo done

exec 2>&5

sleep 4 &
kill -STOP %1
sleep 2	# give time for the shell to get the stop notification
echo after KILL -STOP, foregrounding %1
fg %1

echo done