Ubuntu16.04升级后systemd启动/重启服务时挂起问题咨询
解决systemd启动服务终端挂起问题,以及WantedBy指令详解
一、终端挂起的原因及解决方法
你遇到的终端挂起但服务实际已启动的问题,绝大多数是因为服务单元文件中的Type参数和你的服务运行方式不匹配,具体分两种常见场景:
- 场景1:你的服务是传统后台守护进程(启动后会自动fork到后台运行),但你把
Type设为了默认的simple。systemd会认为这个服务是前台运行的,会一直等待该进程退出,导致终端挂住;而实际上服务已经成功fork到后台,所以Ctrl-C终止前台进程后,后台服务还能正常运行。 - 场景2:你的服务是前台运行的程序(不会自动daemonize),但你错误设置了
Type=forking。systemd会等待父进程退出,但父进程一直在前台运行,直接造成终端挂起。
解决步骤:
- 先确认服务程序的运行特性:
- 直接执行
your-service-command,观察它是一直占用前台,还是立刻返回提示符(此时进程在后台)。
- 直接执行
- 修改服务单元文件(通常路径是
/etc/systemd/system/your-service.service或/lib/systemd/system/your-service.service):- 如果是后台守护进程:设置
Type=forking,同时建议添加PIDFile=/var/run/your-service.pid(如果服务会生成PID文件),让systemd能准确识别后台进程。 - 如果是前台运行的程序:保持
Type=simple(默认值),若程序支持systemd就绪通知,也可以用Type=notify,让systemd更精准判断服务启动状态。
- 如果是后台守护进程:设置
- 注意:不要在
ExecStart的命令末尾加&强制后台运行,这会干扰systemd的进程管理逻辑,反而容易引发异常。
修改后执行systemctl daemon-reload重新加载配置,再测试启动命令即可恢复正常。
二、WantedBy指令的作用
WantedBy=<target>是systemd服务单元里定义服务启用时依赖目标的核心指令:
当你执行systemctl enable your-service时,systemd会在<target>.wants/目录(比如/etc/systemd/system/multi-user.target.wants/)下创建一个指向服务单元文件的软链接。这样,当系统启动到指定的target(相当于传统Linux的运行级别)时,systemd会自动启动该服务。
举两个常见例子:
WantedBy=multi-user.target:表示系统进入多用户命令行模式(非图形界面)时,该服务会被自动启动。WantedBy=graphical.target:表示系统启动到图形界面模式时,该服务会被自动启动。
简单来说,WantedBy决定了「哪些系统运行状态需要这个服务」,启用服务后,它就会被纳入对应target的自动启动序列中。
内容的提问来源于stack exchange,提问作者James Smith
相关产品推荐
相关产品推荐

