临时停止守护进程的持久进程而不会将其杀死

问题描述:

我有一个简单的脚本来检查Web服务器是否正在运行,如果没有,尝试启动它。我把这个脚本放在rc1.d中,这样我的web服务器就不会停止运行。 现在,如果我想停止重新启动webserver,我必须杀死这个脚本。 现在的问题是:如何更改父级脚本,以便手动阻止Web服务器短时间重新启动? 请不要发布与特定发行版相关的答案。 这里是我的脚本:临时停止守护进程的持久进程而不会将其杀死

#!/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的?

+2

发送的监控进程'SIGSTOP',做你想做的事,然后把它'SIGCONT'到可能继续吗? –

用于此目的的解决方案之一是有一个临时文件充当标志,指示您的脚本不采取措施。

你的监控脚本应该是这样的:

#!/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 

正如马克评论以上,另一种解决方案是使用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...),如果可能,这将有更大的机会改变你的条件
  • ,使用守护进程的初始化脚本,而不是手动启动/停止它。 /etc/init.d/lighttpd stop代替killall lighttpd(确切的使用取决于你的系统)