I am running a simulation like this
./waf --run scratch/myfile | awk -f filter.awk 
How can I kill the waf command as soon as filter.awk detects that something happened (e.g. after a specific line is read)? 
I cannot change waf or myfile. I can only change filter.awk, and the above command (obviously).
Update after comments:
waf does not terminated after receiving SIGPIPE (as it should?)This is my own answer (and challenge).
After working on @thatotherguy's ans @Chris's answers, I simplified a bit and got this:
tmp=$(mktemp)
{ ./waf --run scratch/myfile & echo $! > "$tmp"; } | { awk -f filter.awk; pkill -P $(<$tmp); kill $(<$tmp); }
Unfortunately I could not get rid of the tmp file, every attempt to pass the PID as a variable failed. 
I won't change the accepted answer (since it was the one that worked when it was really needed), but +1 for anyone that can simplify more.
Pipeline jobs can be stopped by sending an HTTP POST request to URL endpoints of a build. BUILD ID URL/stop - aborts a Pipeline. BUILD ID URL/term - forcibly terminates a build (should only be used if stop does not work). BUILD ID URL/kill - hard kill a pipeline.
$ ps -fu user Terminate the process. When no signal is included in the kill command-line syntax, the default signal that is used is –15 (SIGKILL). Using the –9 signal (SIGTERM) with the kill command ensures that the process terminates promptly.
The kill command sends a signal (by default, the SIGTERM signal) to a running process. This default action normally stops processes. If you want to stop a process, specify the process ID (PID) in the ProcessID variable.
Use awk's exit statement. waf should exit as soon as the pipe connecting it to awk closes.
What makes this tricky is that waf misbehaves by not exiting when the pipe breaks, and it spawns off a second process that we also have to get rid off:
tmp=$(mktemp)
cat <(./waf --run scratch/myfile & echo $! > "$tmp"; wait) | awk -f filter.awk; 
pkill -P $(<$tmp)
kill $(<$tmp)
<(process substitution) to run waf in the background and write its pid to a temp file. cat as an intermediary to relay data from this process to awk, since cat will exit properly when the pipe is broken, allowing the pipeline to finish. waf has spawned (by Parent PID)waf itself.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With