Sysvinit

為什麼“start-stop-daemon”會產生兩個程序?

  • December 20, 2018

這是我的 SysVinit 文件的一部分。

NAME="flask-daemon"
PIDFILE="/var/run/"$NAME".pid"
DAEMON="/home/ubuntu/flask/run.py"
DAEMON_USER=root

f_start() {
   echo -e "\nStarting : $NAME"
   start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --exec $DAEMON
}

有誰知道錯誤必須在哪裡?

另外,在這種情況下,它只是將ONE程序的PID寫入pidfile,這很糟糕。因此,如果我這樣做/etc/init.d/flask-daemon stop,它只會殺死與被認為寫入文件的 PID 相關的程序。

流程(為什麼是兩個?):

ps aux | grep run.py
root      3591  3.0  1.7 132700 17460 ?        S    19:27   0:00 /usr/bin/python /home/ubuntu/flask/run.py
root      3595  4.5  1.7 213144 18080 ?        Sl   19:27   0:00 /usr/bin/python /home/ubuntu/flask/run.py
root      3602  0.0  0.0  10460   948 pts/0    S+   19:27   0:00 grep --color=auto run.py

PID文件:

$ cat /var/run/flask-daemon.pid
3591

只有一個程序被殺死…

ps aux | grep run.py
root      3595  0.3  1.7 213144 18080 ?        Sl   19:27   0:00 /usr/bin/python /home/ubuntu/flask/run.py
root      3613  0.0  0.0  10460   948 pts/0    S+   19:27   0:00 grep --color=auto run.py

觀察:> 我也嘗試使用--startas,但它也產生了兩個程序,更糟糕的是:它將來自任何其他程序的 PID 記錄到/var/run/flask-daemon.py中,但來自守護程序的 PID 除外

猜測你的守護程序是在守護程序模式下執行的,所以它在啟動時會創建自己的副本。

我認為這可能是“Sl”的“l”部分在 ps 輸出的 STAT 列中的含義。

我最近一直在使用 python-daemon,如果這是你的腳本正在使用的,你可以在你的 daemoncontext 的建構子中告訴它是否分離程序,只是告訴它不要這樣做,你應該是金的。

-或者-

不要使用 start-stop-daemon 並且只創建一個使用 detach_process 標誌的 systemd 服務。

-或者-

兩者都做並告訴您的程序是否要分離該程序。

引用自:https://unix.stackexchange.com/questions/288798