Я использую сценарии оболочки, чтобы реагировать на системные события и обновлять отображение статуса в моем оконном менеджере. Например, один скрипт определяет текущее состояние Wi-Fi, прослушивая несколько источников:
- ассоциировать / отсоединять события от wpa_supplicant
- изменение адреса от ip (так что я знаю, когда dhcpcd назначил адрес)
- процесс таймера (поэтому уровень сигнала обновляется время от времени)
Чтобы добиться мультиплексирования, я в конечном итоге порождаю фоновые процессы:
{ wpa_cli -p /var/run/wpa_supplicant -i wlan0 -a echo &
ip monitor address &
while sleep 30; do echo; done } |
while read line; do update_wifi_status; done &
то есть настройка такова, что всякий раз, когда какой-либо из источников событий выводит строку, мой статус Wi-Fi обновляется. Весь конвейер запускается в фоновом режиме (окончательный '&'), потому что я также смотрю другой источник событий, который вызывает завершение моего скрипта:
wait_for_termination
kill $!
Предполагается, что kill убирает фоновые процессы, но в этой форме он не совсем справляется. Процессы 'wpa_cli' и 'ip' всегда выживают, по крайней мере, и не умирают при следующем событии (теоретически они должны получить SIGPIPE; я думаю, что процесс чтения должен быть еще жив).
Вопрос в том, как надежно [и элегантно!] очистить все фоновые процессы, порожденные?