systemctl教程:程序崩溃自动重启、开机自启

两个高频悲剧:自己跑的程序 SSH 一断就死了;机器重启后发现所有服务全没起来,挨个手动敲命令。MC 开服教程结尾提过一句「systemd 写个 service」,今天把这个坑正式填上——学会 systemd,你的程序就有了崩溃自拉起、开机自启、日志托管三件套,这是 Linux 服务化的基本功。

systemd 是什么:三板斧先会用

systemd 是主流发行版的初始化系统(PID 1),管着机器上所有服务单元。日常只需要三板斧:

systemctl status nginx      # 看状态(最常用,挂了先敲它)
systemctl restart nginx    # 重启
systemctl enable --now nginx   # 设开机自启并立即启动

注意 enable 和 start 的区别:start 是现在启动一次,enable 是登记开机自启——enable --now 一次干完两件事。装完任何服务软件(nginx、docker、面板)先跑一遍 enable –now 是好习惯。

把自己的程序做成服务:完整模板

以一个 Python 程序为例,新建 /etc/systemd/system/myapp.service:

[Unit]
Description=My App
After=network.target

[Service]
User=appuser
ExecStart=/usr/bin/python3 /opt/myapp/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

然后两条命令生效:

systemctl daemon-reload      # 改过任何 service 文件后必须执行
systemctl enable --now myapp

逐段解释:[Unit] 里 After=network.target 表示等网络就绪再启动(联网程序必加);[Service] 里 ExecStart 是启动命令(必须写绝对路径,systemd 不走你的 PATH)、User= 用非 root 账号运行(最小权限思路)、Restart=always + RestartSec=5 是灵魂——程序崩溃 5 秒后自动拉起;[Install] 的 WantedBy 是开机挂钩,照抄即可。MC 服务端同理,把 ExecStart 换成 java 启动命令,WorkingDirectory 指到服务端目录,开服运维就齐活了。

看日志:journalctl 一把梭

systemd 托管的服务日志统一进 journal,一条命令看指定服务:

journalctl -u myapp -f          # 实时追踪(类似 tail -f)
journalctl -u myapp -n 100     # 最近 100 行
journalctl -u myapp --since today  # 今天的日志

比起自己 nohup 重定向日志文件,journal 自带轮转和按服务过滤,排错效率高一截。

服务起不来的五大原因

症状 原因 处理
status 显示 failed ExecStart 路径/参数错 journalctl -u 看报错,核对绝对路径
起了但立刻退出循环重启 程序自身报错退出 看日志修程序;误配时用 systemctl stop 止血
权限拒绝 User= 无文件权限 chown 目录或换用户
开机没自启 只 start 没 enable enable –now 补上
改了 service 没生效 忘了 daemon-reload 每次改完必执行

一个进阶提示:Docker 容器的开机自启走另一条路——docker run 加 --restart=always 或 docker update --restart=always 容器名,原理是 docker 守护进程(它自己是 systemd 服务)替你拉起容器,详见Docker 教程。

至此站内运维体系的最后一块拼图补齐:Docker 跑应用、systemd 管生命周期、Uptime Kuma 盯可用性、备份兜底——四层防线配齐,你这台机器就算进入「睡觉也踏实」状态了。命令为 systemd 标准用法,各发行版通用。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像-主机测评网
欢迎您留下宝贵的见解!
提交
头像-主机测评网

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容