我有这个bash脚本与主管一起运行
#!/bin/bash
DIR="/home/files"
while read file; do
IFS=', ' read -r -a array <<< "$file"
echo "Time: ${array[0]}"
echo "File: ${array[1]}"
#... doing something with the file
done < <(inotifywait -m -r -e close_write "$DIR" --timefmt "%d_%b_%Y" --format "%T %w%f")
它运行得很好,但是当我做supervisorctl stop all
时,即使程序停止,inotifywait
进程仍在运行。一旦bash脚本退出,有没有办法杀死inotifywait
?
编辑此程序的1个Supervisor配置
[program:watch]
command=/root/watch_data.sh
user=root
stderr_logfile=/var/log/supervisord/watch_cloud.log
stdout_logfile=/var/log/supervisord/watch_cloud.log
autorestart=true
stopsignal=INT
当你做supervisorctl stop all
时,我认为你错过了将kill信号传播到所有子进程的选项。通常一个人有父进程和孩子,当父母得到SIGTERM
/ SIGINT
时,它将/应该有一个协调的方式,应该是负责发送信号的人或通过其他方式关闭孩子。
supervisord
只提供了一个选项。来自official documentation
stopasgroup
如果为true,则该标志使主管将停止信号发送到整个进程组并暗示
killasgroup
为真。这对于诸如调试模式下的Flask之类的程序非常有用,它们不会将停止信号传播给它们的子节点,使它们成为孤立的。
killasgroup
如果是真的,当诉诸于发送
SIGKILL
到程序终止它时,将其发送到整个进程组,同时照顾它的子进程,这对于使用多处理的Python程序很有用。
当Supervisor转向发送killasgroup
时,SIGKILL
会杀死该组中的所有进程。这个想法是,当这个过程很好玩时,应该允许它自己处理它的孩子。但是当它行为不端并需要强制选择时,整个过程组才会终止。
还记得传播SIGINT
,虽然默认操作是优雅地终止可以被进程忽略。如果你不太担心脚本的优雅终止,你可以传递SIGKILL
,这相当于kill -9
在Linux中生成的信号。
因此,您的超级用户配置文件中包含以下选项
[program:watch]
command=/root/watch_data.sh
user=root
stderr_logfile=/var/log/supervisord/watch_cloud.log
stdout_logfile=/var/log/supervisord/watch_cloud.log
stopasgroup=true
killasgroup=true
stopsignal=KILL