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.
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.)
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.)