Mam bash, który uruchamia niekończące polecenia jako procesów w tle:hak zamykający bash; lub zabicie wszystkich procesów w tle, gdy główny proces ginie
#!/bin/bash
function xyz() {
# some awk command
}
endlesscommand "param 1" | xyz & # async
pids=$!
endlesscommand "param 2" | xyz & # async
pids="$pids "$!
endlesscommand "param 3" | xyz # sync so the script doesn't leave
Jedynym sposobem, aby zatrzymać tego skryptu jest (musi być) Ctrl-C lub zabić i kiedy to się stanie, muszę zabić wszystkie procesy w tle wymienione w zmiennej $ pids. Jak to zrobić?
Gdyby to było możliwe, aby złapać sygnał kill na głównego procesu i wykonania funkcji, gdy tak się dzieje (hak zamykania), chciałbym zrobić coś takiego:
for $pid in $pids; do kill $pid; done;
Ale nie mogę znaleźć sposobu to zrobić ...
ROZWIĄZANIE z następujących stanowisk:
#!/bin/bash
function xyz() {
# some awk command
}
trap 'jobs -p | xargs kill' EXIT # part of the solution
endlesscommand "param 1" | xyz & # async
endlesscommand "param 2" | xyz & # async
endlesscommand "param 3" | xyz & # don't sync, but wait:
# other part of the solution:
while pgrep -P "$BASHPID" > /dev/null; do
wait
done
Musisz używać pułapek ... – devnull
Nie ma potrzeby utrzymywania jawnej listy procesów potomnych; możesz wywołać 'jobs -p', aby uzyskać identyfikatory procesów dzieci, które wciąż są uruchomione. – chepner