Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

kill & wait in one step

If I use a combination to kill a child process in batch and wait for it's termination, I use

kill $PID
wait $PID

If the process exists immediately, the wait will fail, since the pid is not running anymore.

Is there a way to combine both statements to a single one to aviod the error?

Edit: The process I have to kill uses a tempfile; thus it has to be closed (and not just signaled to close) to start it again. Checking the return value of kill does not help, since this indicates whether the signal was delivered successfully.

like image 496
urzeit Avatar asked Jun 10 '15 07:06

urzeit


2 Answers

It's not a one-liner, but would you be willing to consider spawning off the kill with a short sleep, then waiting in the main thread? Something like:

(sleep 1; kill $PID) &
wait $PID

This addresses your concern of the PID being reused after the kill. Even if you reduce the sleep to something much smaller, it introduces idle time, but it should at least ensure that you wait on the correct process.

like image 144
bto Avatar answered Oct 17 '22 08:10

bto


Effectively, there is not an atomic kill and wait since they are two separate system calls. Some wrapper must be written to execute both functions.

If you do not care about the status,

kill $PID 2> /dev/null
wait $PID 2> /dev/null

If you do care about the status, but do not want an error message, do something like

if ! kill $PID 2> /dev/null; then
    # Error logic here
fi

The fancy way for both is a function

killAndWait() {
    kill $1 2> /dev/null && wait $1 2> /dev/null
}

Then, do

killAndWait $PID
like image 2
RTLinuxSW Avatar answered Oct 17 '22 06:10

RTLinuxSW