我使用 shell 脚本对系统事件做出反应并更新窗口管理器中的状态显示。例如,一个脚本通过侦听多个来源来确定当前的 wifi 状态:
为了实现多路复用,我最终生成了后台进程:
{ 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 &
Run Code Online (Sandbox Code Playgroud)
即,设置是每当任何事件源输出一行时,我的 wifi 状态都会更新。整个管道在后台运行(最后一个“&”),因为我还观察了另一个导致脚本终止的事件源:
wait_for_termination
kill $!
Run Code Online (Sandbox Code Playgroud)
kill 应该清理后台进程,但在这种形式中它并不能完全完成这项工作。'wpa_cli' 和 'ip' 进程总是存活,至少,它们也不会在下一个事件中死亡(理论上它们应该得到一个 SIGPIPE;我猜读取进程也必须仍然存在)。
问题是,如何可靠地[并且优雅地!]清理所有产生的后台进程?