【问题标题】:inotifywait is not killed with supervisorctl stopinotifywait 不会被 supervisorctl stop 杀死
【发布时间】:2018-05-23 21:18:47
【问题描述】:

我让这个 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 该程序的主管配置是

[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

【问题讨论】:

    标签: bash ubuntu supervisord inotifywait


    【解决方案1】:

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

    supervisord 仅提供了一个选项。来自official documentation

    stopasgroup

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

    killasgroup

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

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

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

    所以你的主管配置文件中的以下选项

    [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
    

    【讨论】:

    • 我尝试了您的更改,但还是一样。当我停止程序观看 supervisorctl stop watch 时,我仍然可以看到 inotifywait 正在运行。
    • 更正!我忘了删除autorestart=true。现在看起来它正在工作。让我多玩一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2017-04-15
    • 2011-12-15
    • 2010-12-02
    • 2016-01-24
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多