systemctl 服务管理详解:systemd 开机自启、查看状态与 journalctl 日志实战


装完 Nginx 想让它开机自启、服务挂了想自动拉起、网站起不来想查日志——这些都要和 systemd 打交道。systemctl 是 systemd 的管理命令,CentOS 7+、Ubuntu 16.04+、Debian 8+ 都默认用它,service 那套老命令已经过时了。这篇文章把 systemctl 的常用操作、服务状态解读、开机自启和日志查看一次讲清。

一、systemctl 和 service 有什么区别?

早期 Linux 用 service / chkconfig 管理服务,启动脚本是一堆 shell 脚本;现在的 systemd 用单元文件(unit)管理,并行启动、依赖管理、日志收集都更强大。

service nginx start        # 老方法
systemctl start nginx      # 新方法,推荐

判断你的系统用的是不是 systemd:执行 ps -p 1,输出 PID 1 是 systemd 就是;或者 systemctl --version 能执行就说明是。

二、最常用操作速查

以 Nginx 为例:

systemctl start nginx          # 启动
systemctl stop nginx           # 停止
systemctl restart nginx        # 重启(先停再启,配置改动后常用)
systemctl reload nginx         # 重载配置(不中断服务,Nginx/php-fpm 这类推荐)
systemctl status nginx         # 查看状态(最常用,含日志尾巴)
systemctl enable nginx         # 设置开机自启
systemctl disable nginx        # 取消开机自启
systemctl is-active nginx      # 只看是否在运行(输出 active/inactive)
systemctl is-enabled nginx     # 只看是否开机自启(输出 enabled/disabled)
systemctl list-units --type=service          # 列出所有已加载的服务
systemctl list-unit-files --type=service     # 列出所有服务及开机自启状态
systemctl mask nginx           # 彻底禁用(防误启,恢复用 unmask)

restart 还是 reload? 修改配置文件后,Nginx、php-fpm、Apache 这类支持热重载的服务用 reload,不断连接;改端口、换用户这种结构性变更才需要 restart。

三、status 输出怎么看?

systemctl status nginx 输出里最关键的几行:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 2026-09-19 09:30:00 CST; 2h 3min ago
     Docs: man:nginx(8)
 Main PID: 12345 (nginx)
    Tasks: 3 (limit: 2354)
   Memory: 18.6M
   CGroup: /system.slice/nginx.service
           ├─12345 nginx: master process /usr/sbin/nginx
           └─12346 nginx: worker process
  • Loaded:enabled 表示已设置开机自启;
  • Active:active (running) 正在运行;active (exited) 正常退出(如定时任务类服务);failed 启动失败(重点排查);
  • Main PID:主进程号,kill 它等于重启服务;
  • CGroup:服务派生的所有进程,看这里能发现子进程没退干净。

服务挂了的经典排查:先 systemctl status xxx 看状态和错误,再 journalctl -u xxx 看完整日志,最后 systemctl restart xxx 拉起。

四、journalctl:服务日志统一查看

systemd 把服务的 stdout/stderr 都收进 journal,不用再翻 /var/log 了:

journalctl -u nginx                # 查看 nginx 服务的全部日志
journalctl -u nginx -n 50          # 只看最近 50 行
journalctl -u nginx -f             # 实时跟踪(相当于 tail -f)
journalctl -u nginx --since "2026-09-19 08:00" --until "2026-09-19 09:00"   # 按时间过滤
journalctl -u nginx -p err         # 只看错误级别以上
journalctl --disk-usage            # 查看日志占用磁盘
journalctl --vacuum-size=200M      # 清理日志,保留 200M

注意:有的服务把日志写到自己的文件(如 Nginx 默认 error.log),journal 里可能没有,两处都要看。

五、编写自己的服务单元文件

想让一个脚本/程序变成能开机自启、崩溃自动重启的服务,写一个 unit 文件:

vim /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=always
RestartSec=5
Environment="JAVA_HOME=/usr/local/jdk"
User=www

[Install]
WantedBy=multi-user.target
systemctl daemon-reload        # 修改 unit 后必须重载
systemctl enable myapp         # 设置开机自启
systemctl start myapp          # 启动

关键参数说明: - Type=simple:ExecStart 直接是主进程(默认,最常见);Type=forking:程序启动后 fork 成守护进程(老程序用); - Restart=always:无论什么原因退出都自动重启,防崩溃必备;Restart=on-failure:仅非正常退出时重启; - RestartSec=5:重启前等 5 秒,防止疯狂重启刷日志; - Environment=:给服务设置环境变量,解决"手动跑正常、systemctl 跑找不到命令/变量"的问题; - User=:以指定用户运行,安全隔离,别用 root。

六、常见问题排查

  1. Failed to start xxx.service: Unit not found:服务名拼错,或没安装,systemctl list-unit-files | grep xxx 确认;
  2. Job for nginx.service failed because the control process exited with error code:启动即失败,systemctl status nginx 和 journalctl -u nginx -n 30 看具体报错(八成是配置文件语法错,Nginx 先 nginx -t 验证);
  3. 手动执行脚本正常,systemctl 启动就失败:多半是环境变量问题(PATH 不完整、缺 Environment=),或 WorkingDirectory 不对、路径权限不足;
  4. 服务一直被重启(状态闪烁 Restarting):Restart=always + 启动即崩会无限循环,先 systemctl stop 再用 journalctl 查根因;
  5. 修改了 unit 文件不生效:忘记 systemctl daemon-reload,改完一定要重载;
  6. 开机不自启:检查是否 enable 了,以及 WantedBy=multi-user.target 有没有写。

总结:systemctl 的核心就四件事——start/stop/restart 控制服务,enable/disable 控制自启,status 看状态,journalctl -u 服务名 看日志。服务挂了先 status 再 journalctl,写自定义服务记得 daemon-reload + Restart=always,服务器上的守护任务从此稳稳当当。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 查看系统信息完整指南:uname、lscpu、free、df 与硬件体检命令实战

Linux 管道与文本处理:sort、uniq、wc、xargs 组合实战

评 论
更换验证码