Closed computerquip-work closed 1 year ago
After a bit of research, there's already a waitn implementation internally. forx and gang use that which I then realized allows the -p
argument which means I can run commands in parallel... which means I can already do this.
I'm going to open this back up since I couldn't get this working. I'm not sure if this is an intended use or not.
Basically, all I'm doing is this:
background {
sleep 10
}
importas -i -u PID1 !
background {
sleep 5
}
importas -i -u PID2 !
forx -p -x 0 CUR_PID {
$PID1
$PID2
}
importas -ui CUR_PID CUR_PID
wait { $CUR_PID }
I can't seem to figure out why this doesn't work. I'm assuming it's something to do with the variable substitution in wait { $CUR_PID }
but if it expands to an empty word it should wait for all children and if it doesn't expand at all, I would expect an error. Instead, it just exits immediately.
wait
can only wait for processes that are its direct children. The fact that you're interposing a forx
process prevents it from working.
Replace the whole forx
statement with just wait { $PID1 $PID2 }
and it should do what you want.
The problem I'm having with wait { $PID1 $PID2 }
is that I want to exit if either $PID1
exits or $PID2
exits, not when both exit.
Oh, that's right. It's an interesting feature to have; I will add it in a future version. In the meantime, indeed, I don't think there's a simple way to do this in execline at the moment, sorry.
The wait
command now has a -o
option that does exactly what you want.
Closing this.
Bash has job control functionality that lets you provide a set of pids and then exit when any one of them exits. I think this can be implemented with wait and using
signal(SIGCHLD, SIG_IGN)
. As far as I know, since it's a builtin in bash and there's no other command to do this, currently if you have multiple background processes and need to wait on any of them to die, it's not possible with just execline.