这是我的 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 服务。
-或者-
执行这两项操作并告诉您的进程是否要分离该进程。