如何让supervisord重启鸿工?

时间:2017-04-27 18:22:37

标签: background-process supervisord worker

我有一些由supervisord管理的Python工作者,如果他们正常工作,应该连续打印到stdout(在每个完成的任务之后)。但是,它们往往会挂起,我们很难找到错误。理想情况下,监督人员会注意到他们没有在X分钟内打印并重新启动它们;任务是幂等的,所以不优雅的重启很好。是否有任何supervisord功能或插件可以做到这一点?或者是另一个类似管理员的程序,开箱即用?

我们已经在使用http://superlance.readthedocs.io/en/latest/memmon.html来杀死内存使用量猛增,这可以缓解一些挂起,但是一个不会导致内存泄漏的挂起仍然会导致工作人员陷入停顿。 / p>

1 个答案:

答案 0 :(得分:6)

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

例如:

<强> kill-if-hung.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

然后你将在supervisord中运行一个python脚本,如:kill-if-hung.sh python -u some-script.py-u来禁用输出缓冲,或设置PYTHONUNBUFFERED)。

我相信你可以想象一个类似的东西的python脚本。