Background process 如何让主管重新启动吊运工人?

Background process 如何让主管重新启动吊运工人?,background-process,supervisord,worker,Background Process,Supervisord,Worker,我有一些由supervisord管理的Python工作人员,如果他们工作正常,他们应该(在完成每个任务后)不断打印到stdout。然而,它们往往会挂起,我们很难找到bug。理想情况下,supervisord会注意到他们在X分钟内没有打印,然后重新启动它们;任务是幂等的,因此非优雅重启是可以的。是否有任何supervisord功能或插件可以做到这一点?或者是另一个像主管一样的程序,有这个现成的 我们已经在使用to kill if内存使用量猛增,这减轻了一些挂起,但是,不会导致内存泄漏的挂起仍然会导

我有一些由supervisord管理的Python工作人员,如果他们工作正常,他们应该(在完成每个任务后)不断打印到stdout。然而,它们往往会挂起,我们很难找到bug。理想情况下,supervisord会注意到他们在X分钟内没有打印,然后重新启动它们;任务是幂等的,因此非优雅重启是可以的。是否有任何supervisord功能或插件可以做到这一点?或者是另一个像主管一样的程序,有这个现成的


我们已经在使用to kill if内存使用量猛增,这减轻了一些挂起,但是,不会导致内存泄漏的挂起仍然会导致工作进程停止。

一种可能的解决方案是将python脚本包装在bash脚本中,该脚本将监视它,并在一段时间内没有输出到stdout时退出

例如:

挂起时杀死。sh

#!/usr/bin/env bash
set -e

TIMEOUT=60
LAST_CHANGED="$(date +%s)"

{
    set -e
    while true; do
        sleep 1
        kill -USR1 $$
    done
} &

trap check_output USR1

check_output() {
    CURRENT="$(date +%s)"
    if [[ $((CURRENT - LAST_CHANGED)) -ge $TIMEOUT ]]; then
        echo "Process STDOUT hasn't printed in $TIMEOUT seconds"
        echo "Considering process hung and exiting"
        exit 1
    fi
}

STDOUT_PIPE=$(mktemp -u)
mkfifo $STDOUT_PIPE

trap cleanup EXIT
cleanup() {
    kill -- -$$ # Send TERM to child processes
    [[ -p $STDOUT_PIPE ]] && rm -f $STDOUT_PIPE
}

$@ >$STDOUT_PIPE || exit 2 &

while true; do
    if read tmp; then
        echo "$tmp"
        LAST_CHANGED="$(date +%s)"
    fi
done <$STDOUT_PIPE
#/usr/bin/env bash
set-e
超时=60
上次更改=“$(日期+%s)”
{
set-e
虽然是真的;做
睡眠1
kill-USR1$$
完成
} &
陷阱检查输出USR1
检查输出(){
当前=“$(日期+%s)”
如果[[$((当前-上次更改))-ge$超时]];则
echo“进程标准输出在$TIMEOUT秒内未打印”
echo“考虑挂起和退出流程”
出口1
fi
}
标准管道=$(mktemp-u)
mkfifo$标准管道
陷阱清理出口
清理(){
kill--$$#将术语发送到子进程
[[-p$STDOUT_管道]]和&rm-f$STDOUT_管道
}
$@>$STDOUT|u管道|出口2&
虽然真实;做
如果读取tmp;然后
echo“$tmp”
上次更改=“$(日期+%s)”
fi

好了,谢谢!这里发生了很多事情,谢谢你写这篇文章!用于轮询的后台处理,通过信号向主脚本发送信号;临时FIFO,以确保主脚本获得子脚本的输出;正确的信号处理,代理任何出口上的子级(SIGINT和SIGTERM触发一个
trap\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!