从 service 到 systemctl
老教程里的 service nginx start 如今只是个兼容壳,背后都转给了 systemd——现代 Linux 的 1 号进程(PID 1),系统里所有服务的总管家。它的命令前缀是 systemctl。
$ systemctl start nginx # 启动
$ systemctl stop nginx # 停止
$ systemctl restart nginx # 重启(断了再起)
$ systemctl reload nginx # 重载配置(不断服务,nginx 常用)
$ systemctl status nginx # 状态 + 最近日志(排错第一眼)
$ systemctl enable nginx # 开机自启(一次性设置,不是启动!)
$ systemctl disable nginx # 取消开机自启
$ systemctl list-units --state=failed # 看有没有服务挂了区分两组概念:start/stop 是「现在」,enable/disable 是「未来开机」——只 enable 不 start,服务现在并不会跑。
unit 文件:服务的户口本
每个服务是一个 .service 文件,自研服务放 /etc/systemd/system/。把 Spring Boot 应用注册成服务只需十几行:
# /etc/systemd/system/note-app.service
[Unit]
Description=Note Spring Boot App
After=network.target mysql.service # 依赖:网络和 MySQL 就绪后再起
[Service]
User=app # 专用用户跑(权限篇的三军规)
ExecStart=/opt/jdk/bin/java -jar /opt/app/note.jar --server.port=8080
Restart=always # 挂了自动拉起
RestartSec=5
[Install]
WantedBy=multi-user.target最值钱的是 Restart=always——进程 OOM、异常退出都能被自动拉起,这是 nohup 永远给不了的。
改完配置的两步收尾
$ systemctl daemon-reload # 新建/修改 unit 文件后必做(重载配置清单)
$ systemctl enable --now note-app # 设自启 + 立即启动(一步到位)
$ systemctl status note-app # Active: active (running) 才算起好了状态起不来时,status 输出的最后几行就是最近日志;想看全量,journalctl -u note-app -f——systemd 顺手接管了日志,这个命令在日志篇还会重点讲。
常见翻车点
改了 unit 不 reload——systemd 用的还是旧配置;ExecStart 必须写绝对路径——包括 java 本身,没有 PATH 环境变量可用;User 忘了配——默认 root 跑,安全审计过不了。下一篇:软件包管理——yum 和 apt 的两大家族、装过的软件去哪了、以及命令找不到时怎么反查它属于哪个包。
评论 (0)