supervisor守护进程子进程问题

在使用 supervisor 守护 start_syncserver.sh 脚本运行 Anki syncserver 时,如果执行 supervisorctl stop 后发现进程没有正确关闭,这可能与以下几个原因有关:

1. 子进程问题

supervisor 可能只管理了启动脚本的进程,而没有管理由脚本启动的子进程。anki.syncserver 进程可能作为子进程运行,而不是直接由 supervisor 管理,因此在停止脚本时,子进程不会自动终止。

解决方法:

确保 supervisor 能够正确管理所有子进程。你可以在 supervisor 配置中使用 stopsignal 选项,将信号发送给主进程及其所有子进程:

[program:syncserver]
command=/bin/bash /path/to/start_syncserver.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/syncserver.err.log
stdout_logfile=/var/log/supervisor/syncserver.out.log
stopsignal=QUIT
stopasgroup=true
killasgroup=true

stopasgroup=truekillasgroup=true 会确保 supervisor 在停止进程时会杀死整个进程组,包括脚本生成的所有子进程。

2. 脚本运行方式

在你的 start_syncserver.sh 中,anki.syncserver 进程可能是在后台运行,或者脚本的进程控制方式导致 supervisor 无法正确跟踪 anki.syncserver

解决方法:

修改脚本,确保 anki.syncserver 直接在前台运行,而不是通过后台方式启动:

#!/bin/bash
export SYNC_USER1=username1:password1
export SYNC_USER2=username2:password2
export SYNC_PORT=29901
exec ~/syncserver/bin/python -m anki.syncserver

exec 命令会将 anki.syncserver 进程替换为脚本本身的进程,使 supervisor 能直接管理 anki.syncserver