mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-20 08:54:00 +00:00
efda4f5c39
Instead of trying to assert that there are no zombies when the test starts (which often fails) and to prevent conflating existing or irrelevant zombies with the ones we are interested in checking for, have `ps` also emit the parent process id and filter its output to include only children of the current fish instance.
125 lines
2.8 KiB
Fish
125 lines
2.8 KiB
Fish
#RUN: %fish %s
|
|
|
|
# Verify zombies are not left by disown (#7183, #5342)
|
|
# Do this first to avoid colliding with the other disowned processes below, which may
|
|
# still be running at the end of the script
|
|
sleep 0.2 &
|
|
disown
|
|
sleep 0.2
|
|
echo Trigger process reaping
|
|
sleep 0.1
|
|
#CHECK: Trigger process reaping
|
|
# The initial approach here was to kill the PID of the sleep process, which should
|
|
# be gone by the time we get here. Unfortunately, kill from procps on pre-2016 distributions
|
|
# does not print an error for non-existent PIDs, so instead look for zombies in this session.
|
|
# There could already be zombies from previous tests run in this session or a test could be run
|
|
# simultaneously that causes a zombie to spawn, so limit the output only to processes started by
|
|
# this fish instance.
|
|
if not contains (uname) SunOS
|
|
ps -o ppid,stat
|
|
else
|
|
ps -o ppid,s
|
|
end | string match -e $fish_pid | string match 'Z*'
|
|
|
|
# Verify disown can be used with last_pid, even if it is separate from the pgroup.
|
|
# This should silently succeed.
|
|
command true | sleep 0.5 &
|
|
disown $last_pid
|
|
|
|
jobs -q
|
|
echo $status
|
|
#CHECK: 1
|
|
sleep 5 &
|
|
sleep 5 &
|
|
jobs -c
|
|
#CHECK: Command
|
|
#CHECK: sleep
|
|
#CHECK: sleep
|
|
jobs -q
|
|
echo $status
|
|
#CHECK: 0
|
|
bg -23 1 2>/dev/null
|
|
or echo bg: invalid option -23 >&2
|
|
#CHECKERR: bg: invalid option -23
|
|
fg 3
|
|
#CHECKERR: fg: No suitable job: 3
|
|
bg 3
|
|
#CHECKERR: bg: Could not find job '3'
|
|
sleep 1 &
|
|
disown
|
|
jobs -c
|
|
#CHECK: Command
|
|
#CHECK: sleep
|
|
#CHECK: sleep
|
|
jobs 1
|
|
echo $status
|
|
#CHECK: 1
|
|
#CHECKERR: jobs: No suitable job: 1
|
|
jobs foo
|
|
echo $status
|
|
#CHECK: 2
|
|
#CHECKERR: jobs: 'foo' is not a valid process id
|
|
jobs -q 1
|
|
echo $status
|
|
#CHECK: 1
|
|
jobs -q foo
|
|
echo $status
|
|
#CHECK: 2
|
|
#CHECKERR: jobs: 'foo' is not a valid process id
|
|
disown foo
|
|
#CHECKERR: disown: 'foo' is not a valid job specifier
|
|
disown (jobs -p)
|
|
or exit 0
|
|
|
|
# Verify `jobs` output within a function lists background jobs
|
|
# https://github.com/fish-shell/fish-shell/issues/5824
|
|
function foo
|
|
sleep 0.2 &
|
|
jobs -c
|
|
end
|
|
foo
|
|
|
|
# Verify we observe job exit events
|
|
sleep 1 &
|
|
set sleep_job $last_pid
|
|
function sleep_done_$sleep_job --on-job-exit $sleep_job
|
|
/bin/echo "sleep is done"
|
|
functions --erase sleep_done_$sleep_job
|
|
end
|
|
sleep 2
|
|
|
|
# Verify `jobs -l` works and returns the right status codes
|
|
# https://github.com/fish-shell/fish-shell/issues/6104
|
|
jobs --last --command
|
|
echo $status
|
|
#CHECK: Command
|
|
#CHECK: sleep
|
|
#CHECK: sleep is done
|
|
#CHECK: 1
|
|
sleep 0.2 &
|
|
jobs -lc
|
|
echo $status
|
|
#CHECK: Command
|
|
#CHECK: sleep
|
|
#CHECK: 0
|
|
|
|
function foo
|
|
function caller --on-job-exit caller
|
|
echo caller
|
|
end
|
|
echo foo
|
|
end
|
|
|
|
function bar --on-event bar
|
|
echo (foo)
|
|
end
|
|
|
|
emit bar
|
|
#CHECK: foo
|
|
#CHECK: caller
|
|
|
|
# We can't rely on a *specific* pgid being assigned,
|
|
# but we can rely on it not being fish's.
|
|
command true &
|
|
set -l truepid $last_pid
|
|
test $truepid != $fish_pid || echo true has same pid as fish
|