Process Management
Background and Wait
Collecting Status
& starts a command in the background. $! records its process id, and wait collects the final exit status.
Program
Play the script to start a short background job and collect its selected status.
background_wait.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
job_status=0
(exit "$job_status") &
pid=$!
wait "$pid"
status=$?
echo "status=$status"
#!/usr/bin/env bash
job_status=1
(exit "$job_status") &
pid=$!
wait "$pid"
status=$?
echo "status=$status"
#!/usr/bin/env bash
job_status=2
(exit "$job_status") &
pid=$!
wait "$pid"
status=$?
echo "status=$status"
job_status ← 0
3job_status=04(exit "$job_status") &values this step0job_statusbackground job ← started
3job_status=04(exit "$job_status") &5pid=$!values this stepstartedbackground job0job_statuspid ← child pid
4(exit "$job_status") &5pid=$!6wait "$pid"values this stepchild pidpidwait ← finished
5pid=$!6wait "$pid"7status=$?values this stepfinishedwaitchild pidpidstatus ← 0
6wait "$pid"7status=$?8echo "status=$status"values this step0statusecho "status=$status"
7status=$?8echo "status=$status"outputstatus=0values this step0status
job_status ← 1
3job_status=14(exit "$job_status") &values this step1job_statusbackground job ← started
3job_status=14(exit "$job_status") &5pid=$!values this stepstartedbackground job1job_statuspid ← child pid
4(exit "$job_status") &5pid=$!6wait "$pid"values this stepchild pidpidwait ← finished
5pid=$!6wait "$pid"7status=$?values this stepfinishedwaitchild pidpidstatus ← 1
6wait "$pid"7status=$?8echo "status=$status"values this step1statusecho "status=$status"
7status=$?8echo "status=$status"outputstatus=1values this step1status
job_status ← 2
3job_status=24(exit "$job_status") &values this step2job_statusbackground job ← started
3job_status=24(exit "$job_status") &5pid=$!values this stepstartedbackground job2job_statuspid ← child pid
4(exit "$job_status") &5pid=$!6wait "$pid"values this stepchild pidpidwait ← finished
5pid=$!6wait "$pid"7status=$?values this stepfinishedwaitchild pidpidstatus ← 2
6wait "$pid"7status=$?8echo "status=$status"values this step2statusecho "status=$status"
7status=$?8echo "status=$status"outputstatus=2values this step2status
Follow the Background Job
job_statusstarts as0.(exit "$job_status") &starts a background child process.$!stores the child process id inpid.wait "$pid"waits for the child to finish.$?becomes the child's status, so the script printsstatus=0. | step | recorded value | | --- | --- | |job_status| 0 | | background job | started | |pid| child pid | |wait| finished | |status| 0 |
background job
`command &` starts a command and immediately returns control to the script.
$!
`$!` stores the process id of the most recent background command.
wait
`wait "$pid"` pauses until that process finishes and returns its status.
Exercise: background_wait.sh
Reproduce status=0, then use the pinned job_status variants 1 and 2 to predict status=1 and status=2.