gpt4 book ai didi

linux - 为持久进程临时停止守护进程而不杀死它

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:20 41 4
gpt4 key购买 nike

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

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

最佳答案

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

您的监控脚本如下所示:

#!/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...) 之间休眠,这将有您的情况更有可能发生变化
  • 如果可能,使用守护进程的初始化脚本而不是手动启动/停止它,例如/etc/init.d/lighttpd stop 而不是 killall lighttpd(具体用法因系统而异)

关于linux - 为持久进程临时停止守护进程而不杀死它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42325501/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com