为什么“start-stop-daemon”会产生两个进程?

为什么“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
}

有谁知道错误一定出在哪里?

另外,可怕的是在这种情况下,它只将一个进程的PID写入pid文件。因此,如果我这样做/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 除外

答案1

猜测您的守护进程正在守护进程模式下运行,因此它在启动时会创建自身的副本。

我认为这可能就是 ps 输出的 STAT 列中“Sl”的“l”部分的含义。

我最近经常使用 python-daemon,如果你的脚本正在使用它,你可以告诉它是否在你的 daemoncontext 的构造函数中分离进程,只要告诉它不要这样做,你应该金的。

-或者-

不要使用 start-stop-daemon,而只是创建一个使用 detach_process 标志的 systemd 服务。

-或者-

执行这两项操作并告诉您的进程是否要分离该进程。

相关内容