最近,我遇到了自定义 HTTP 服务器的手工“keepalive”看门狗的实现:
|
| keepalive.sh
| init.sh
|_ main.py
有三个文件。第一个是:它从系统启动时keepalive.sh
运行。root
rc.local
# keepalive.sh
while true
do
if curl -s "localhost:8080/alive.txt" | grep -q "ALIVE"; then
echo "UP
else
echo "Restarting..."
pkill -u www-data -SIGKILL
fi
sleep 30
done
第二个是以用户init.sh
身份运行的www-data
。
# init.sh
set -m
/usr/bin/python3 /var/www/main.py &
while true; do fg; sleep 1; done
第三个是自定义服务器本身main.py
,需要保持活动状态。
from server import Server
HOST = '0.0.0.0'
PORT = 8080
if __name__ == "__main__":
Server(HOST,PORT).listen()
我不太明白如何init.sh
运作。通过-m
标志我们启用作业控制为了fg
从脚本文件中使用。发送main.py
到后台然后fg
无限执行的目的是什么while
?我知道&
这里需要在服务器启动后进入循环,但是为什么要使用确切的fg
(而不仅仅是)?true
我不明白的另一件事是为什么init.sh
当它被杀死时会重新启动-SIGKILL
。 Python 脚本在单独的进程组中启动,init.sh
其 PID 作为其自己的 PPID。main.py
当他的父母(init.sh
)被杀时,他也会被杀,我同意这一点。对我来说,问题是为什么在它被杀死后init.sh
不断重新启动(以及它本身) 。main.py
pkill
谢谢!