Sysvinit
為什麼“start-stop-daemon”會產生兩個程序?
這是我的 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 服務。
-或者-
兩者都做並告訴您的程序是否要分離該程序。