Utilizo scripts de shell para reaccionar a los eventos del sistema y actualizar las pantallas de estado en mi administrador de ventanas. Por ejemplo, un script determina el estado actual de wifi escuchando múltiples fuentes:
- asociar / disociar eventos de wpa_supplicant
- la dirección cambia de ip (entonces sé cuando dhcpcd ha asignado una dirección)
- un proceso de temporizador (para que la intensidad de la señal se actualice de vez en cuando)
Para lograr la multiplexación, termino generando procesos en segundo plano:
{ 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 &
es decir, la configuración es que cada vez que cualquiera de las fuentes de eventos genera una línea, mi estado de wifi se actualiza. Toda la canalización se ejecuta en segundo plano (el '&' final) porque también veo otro origen de eventos que hace que mi script finalice:
wait_for_termination
kill $!
Se supone que kill elimina los procesos en segundo plano, pero de esta forma no hace el trabajo. Los procesos 'wpa_cli' e 'ip' siempre sobreviven, al menos, y tampoco mueren en su próximo evento (en teoría deberían obtener un SIGPIPE; supongo que el proceso de lectura también debe estar vivo).
La pregunta es, ¿cómo limpiar de manera confiable [y elegante!] Todos los procesos en segundo plano generados?