持久进程的临时停止守护进程而不杀死它

时间:2017-02-19 09:17:47

标签: linux bash

我有一个简单的脚本来检查网络服务器是否正在运行,如果不是,则尝试启动它。我把这个脚本放在rc1.d中,所以我的网络服务器永远不会停止运行。 现在,如果我想阻止webserver重启,我必须杀死这个脚本。 问题是:如何更改父脚本,以便我可以阻止webserver手动重启一小段时间? 请不要发布与特定发行版相关的答案。 这是我的剧本:

#!/bin/sh

if [ "$1" = "stop" ] ; then
    echo "Stoping lighttpd..."
    killall lighttpd
    PID=`pidof lighttpd`
    if [ "$PID" != "" ] ; then
        kill -9 $PID
    fi
    exit;
fi

PID=`pidof lighttpd`
if [ "$PID" == "" ] ; then
    echo "Starting lighttpd..."
    nohup lighttpd >/dev/null 2>/dev/null &
fi

PID=`pidof lighttpd`

while [ "1" == "1" ]
do
    PID=`pidof lighttpd`
    sleep 3
    if [ "$PID" == "" ] ; then
        echo "Restarting lighttpd..."
        nohup lighttpd >/dev/null 2>/dev/null &
        sleep 2
    fi
done

有什么方法可以改变它,所以如果不杀死这个脚本我就能停止lighttpd?

1 个答案:

答案 0 :(得分:1)

用于此目的的解决方案之一是使用一个临时文件作为标志,表示您的脚本不采取行动。

您的监控脚本如下所示:

#!/bin/bash

if [ "$1" = "stop" ] ; then
    echo "Stoping lighttpd..."
    killall lighttpd
    PID=$(pidof lighttpd)
    if [ "$PID" != "" ] ; then
        kill -9 $PID
    fi
    exit;
fi

MSG="Starting lighttpd..."
while [ true ]; do
    PID=$(pidof lighttpd)
    if [ -z "$PID" -a ! -f /var/run/.pause_monitor_lighttpd ] ; then
        echo "$MSG"
        nohup lighttpd >/dev/null 2>/dev/null &
    fi
    MSG="Restarting lighttpd..."
    sleep 3
done

然后,要暂停监控,您会:

touch /var/run/.pause_monitor_lighttpd

并取消暂停监控:

rm -f /var/run/.pause_monitor_lighttpd

正如Mark上面所说,另一种解决方案是使用SIGSTOPSIGCONT信号暂时停止脚本。请记住,如果您的脚本由其他某种机制重新启动,它会立即启动并重新启动Web服务器。假设您的脚本名为monitor_lighttpd.sh,您可以使用它来暂停监控:

pkill -STOP -f '/bin/bash .*/monitor_lighttpd.sh'

然后,取消暂停:

pkill -CONT -f '/bin/bash .*/monitor_lighttpd.sh'

一般提示:

  • 使用$(command)代替`command`
  • 在检测到条件(PID=...)并对其采取行动(if [ $PID...)之间不要睡觉,这将更有可能改变您的状况
  • 如果可能,请使用守护程序的init脚本,而不是手动启动/停止它,例如/etc/init.d/lighttpd stop代替killall lighttpd(具体用法因系统而异)