Is there an elegant way, in the shell, to say “run this program until this other program is finished”?

I know I could run a thing, get a PID and then append a command with “&& kill pid” or something but that feels clunky.

@mhoye Unfortunately, I think the Unix process and signal model makes this inextricably messy. There's no polite general way to ask a process to terminate, and you can only easily find out about a child ending if you're its parent. So you're going to have to kill the process with a signal and that means knowing its PID and ... mess.

(If the program has a specific API where you can say 'please exit', you can use it, but that's not a general solution.)

@cks @mhoye

There's no polite general way to ask a process to terminate

Is that not what SIGTERM is? (I suppose it could be argued that a signal that defaults to immediate termination isn't entirely "polite", but hopefully a program that would actually be sensitive to such impoliteness would install a handler for it to do appropriate things before exiting.)

you can only easily find out about a child ending if you're its parent.

In terms of portable mechanisms yes, though on a reasonably recent Linux you can use poll(2) or the like on a a pidfd for a non-child process.

(Offhand I don't know of any existing tools that expose pidfds in a shell-convenient way, but if someone were sufficiently desperate I expect a bash extension loaded via enable -f could probably do it in a reasonably ergonomic fashion.)

@zev @mhoye It's not safe to SIGTERM arbitrary programs and assume that everything will go fine, so in that sense it's not polite. In my view, a polite general way would have to be something that processes ignore by default. SIGTERM's defaults make it not an 'ask', not really.