supervisorctl start报错command not found,说明supervisord未安装或未启动,或supervisorctl命令不在path中;需先用which supervisord或supervisord --version确认安装状态,再依发行版启用服务。

supervisorctl start 报错 command not found
直接运行 supervisorctl start 时提示 command not found,说明 supervisord 服务根本没启动,或者命令不在 PATH 中。Debian/Ubuntu 默认安装后不会自动启用服务,CentOS 需先装 epel-release 才能装上 supervisor。
先确认是否已安装并启动:
- 运行
which supervisord或supervisord --version,无输出就说明没装好 - Ubuntu/Debian:执行
sudo systemctl enable --now supervisor - CentOS 7/8:先
sudo yum install epel-release,再sudo yum install supervisor,然后sudo systemctl enable --now supervisord - 若用宝塔面板,直接在【软件商店】搜 “Supervisor” 安装插件,它会自动处理依赖和启动
Gin 二进制程序的 supervisor 配置写法
Gin 项目通常编译为单个二进制文件(如 myapi),不依赖 go run 或环境变量,配置要避免路径错误和权限问题。
在 /etc/supervisor/conf.d/myapi.ini 中写入:
[program:myapi] command=/www/wwwroot/myapi/myapi directory=/www/wwwroot/myapi user=www autostart=true autorestart=true startsecs=3 startretries=3 redirect_stderr=true stdout_logfile=/www/wwwroot/myapi/logs/access.log stdout_logfile_maxbytes=20MB stdout_logfile_backups=5 stopasgroup=true killasgroup=true
关键点:
-
command必须是绝对路径,不能写./myapi或myapi -
user推荐设为www(宝塔默认)或nginx,别用root,否则可能因权限过高被拒绝绑定 80/443 端口 -
stopasgroup和killasgroup必须为true,否则 Gin 启动的子 goroutine(如 HTTP server)可能残留,导致下次启动报Address already in use -
directory要和二进制所在目录一致,否则读取配置文件、静态资源会失败
supervisor reread 后 update 不生效
执行 sudo supervisorctl reread 显示配置已加载,但 sudo supervisorctl update 后仍看不到进程,或状态为 FATAL。
常见原因和检查项:
- 配置文件后缀必须是
.ini(不是.conf或.cfg),且放在/etc/supervisor/conf.d/下 - 运行
sudo supervisorctl status,若显示FATAL Exited too quickly (process log may have details),立刻查日志:tail -n 20 /www/wwwroot/myapi/logs/access.log - 典型错误:Gin 启动时 panic(比如数据库连接失败、端口被占、配置文件缺失),
supervisord会在startsecs内退出,触发FATAL - 临时调试:手动运行
/www/wwwroot/myapi/myapi,看终端是否直接报错;若正常,再检查user权限是否导致无法读取证书、配置等文件
为什么 Gin 进程被 kill 后没自动重启
现象是 ps aux | grep myapi 找不到进程,但 supervisorctl status 里还是 RUNNING,或反复显示 STARTING → FATAL。
本质是 supervisord 没收到子进程死亡信号,或配置没生效:
- 确认
autorestart=true已设置(不是autostart) - 检查
startsecs是否太短:Gin 初始化 DB、Redis 等耗时较长时,设成10更稳妥 - 不要依赖
nohup或&启动方式——supervisord本身会 fork 子进程并接管,加nohup反而造成进程树混乱 - 如果 Gin 使用了
os.Exit()或调用了syscall.Kill(),会绕过 supervisor 的生命周期管理,应改用log.Fatal()或让主 goroutine 自然退出
最易忽略的是:Gin 二进制在启动时静默失败(比如 config.yaml 缺字段),supervisord 只看到进程秒退,却不知道原因——务必打开 stdout 日志并盯住前几行输出。











