为什么无限 while 循环中的 fg 命令就像“保持活动”看门狗一样工作?

为什么无限 while 循环中的 fg 命令就像“保持活动”看门狗一样工作?

最近,我遇到了自定义 HTTP 服务器的手工“keepalive”看门狗的实现:

|
|   keepalive.sh
|   init.sh
|_  main.py

有三个文件。第一个是:它从系统启动时keepalive.sh运行。rootrc.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.pypkill

谢谢!

相关内容