3

我有这个与主管一起运行的 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进程也会继续运行。inotifywait一旦 bash 脚本退出,有没有办法杀死它?

此程序的编辑 1 主管配置是

[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
4

1 回答 1

4

我认为您错过了一个选项,可以在您这样做时将终止信号传播到所有子进程supervisorctl stop all。通常有一个父进程和子进程,当父进程SIGTERM/SIGINT它将/应该有一个协调的方式,应该是负责发送信号或通过其他方式关闭子进程的人。

仅提供supervisord了一个选项。来自官方文档

stopasgroup

如果为真,则该标志使主管向整个进程组发送停止信号,并暗示killasgroup为真。这对于程序很有用,例如调试模式下的 Flask,它们不会将停止信号传播给他们的孩子,让他们成为孤立的。

killasgroup

如果为真,当诉诸发送SIGKILL到程序以终止它时,它会将其发送到其整个进程组,同时照顾其子进程,例如对于使用多处理的 Python 程序很有用。

killasgroupSupervisor 发送一个SIGKILL. 这个想法是,当进程运行良好时,应该允许它自己处理停止它的子进程。但是当它行为不端并且需要一个强制整个进程组终止的选项时。

还要记住传播SIGINT,尽管默认操作是优雅地终止,但进程可以忽略。如果你不太担心脚本的优雅终止,你可以通过SIGKILL它相当于kill -9Linux 中生成的信号。

因此,您的主管配置文件中的以下选项

[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
于 2017-12-16T06:01:30.900 回答