Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: vallor Newsgroups: comp.unix.shell Subject: Re: Cleaning up background processes Date: Mon, 6 May 2024 00:19:32 -0000 (UTC) Organization: A noiseless patient Spider Lines: 60 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Mon, 06 May 2024 02:19:33 +0200 (CEST) Injection-Info: dont-email.me; posting-host="b06b76e9fef9a4b156c4d134c0584b77"; logging-data="2026705"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18pmCPgpOpfISVKG7YiW8SE" User-Agent: Pan/0.158 (Avdiivka; aa34dd6 gitlab.gnome.org/GNOME/pan.git; x86_64-pc-linux-gnu) Cancel-Lock: sha1:I9aaHnYqDFMxgIbh5FIXWLASUiI= X-Face: \}2`P"_@pS86<'EM:'b.Ml}8IuMK"pV"?FReF$'c.S%u9 wrote in : > Is there a standard POSIX shell idiom to clean up background processes? > > You have a shell script that starts some background process with &. Now > you want to make sure that the background process terminates when the > shell script terminates. In particular, when it terminates due to > special circumstances. > > A noninteractive shell doesn't use job control, so the background > process shares the same process group. That's great! When somebody > hits ^C, SIGINT is sent to the whole process group. The same for ^\ and > SIGQUIT, and for SIGHUP when the modem hangs up^W^W^Wxterm is closed. > So the background process will be terminated by default. > > Except... bash seems to block SIGINT for background processes. As does > FreeBSD's sh with both SIGINT and SIGQUIT. What now? > > Also, the shell script is typically invoked from some implementation of > make(1), which seems to add more complications. > > This seems like a sufficiently common problem that there must be a > standard solution. I have scripts that need to kill off processes started with "&", and there's a couple ways to do it. One way is "kill -1 0" -- sending the HUP signal with "0" as the process number will send the signal to the process group. Another way is to remember the process, such as: sleep 1000000 & # backgrounded process BACKGROUND=$! And then set a trap: trap "kill -1 $BACKGROUND" 0 You can get even fancier with something like: hang_up_the_phone() { HPID=$1; kill -0 $HPID > /dev/null 2>&1 && kill -1 $HPID; } trap "hang_up_the_phone $BACKGROUND" 0 I have a script that uses both, if you'd like me to post it -- it runs xdaliclock in timer mode, as well as a sleep for the length of the timer. For that, the trap looks like this: trap "hang_up_the_phone $BACK1 ; \ hang_up_the_phone $BACK2 ; " 0 CHLD; -- -v