Linux 入门:用 systemd 把自己的脚本变成开机自启的后台服务
刚接触 Linux 的同学常遇到这样的需求:写了一个 Python 或 Shell 脚本,希望它开机自动运行、崩溃后能自己重启,还能方便地查看日志。在主流发行版(Ubuntu、Debian、CentOS、openEuler 等)里,最规范的做法就是使用 systemd 创建一个服务单元(unit)。本文用一个最小示例,带你走通整个流程。
一、准备一个测试脚本
先写一个每隔 10 秒输出一行时间的脚本,放在 /opt/demo/hello.sh:
#!/bin/bash while true; do echo "hello at $(date '+%F %T')" sleep 10 done
记得执行 chmod +x /opt/demo/hello.sh,让它拥有可执行权限。
二、编写 service 文件
用 root 或 sudo 创建 /etc/systemd/system/hello.service,内容如下:
[Unit] Description=Hello demo service After=network.target [Service] Type=simple ExecStart=/opt/demo/hello.sh Restart=on-failure RestartSec=5 User=nobody [Install] WantedBy=multi-user.target
几个关键字段的含义:After 表示在网络就绪之后再启动;ExecStart 必须写脚本的绝对路径;Restart=on-failure 表示异常退出时自动重启,RestartSec 是重启前等待的秒数;User 指定运行身份,尽量不要用 root,这是最小权限原则;WantedBy=multi-user.target 表示在正常多用户模式下随系统启动。
三、加载并启动服务
sudo systemctl daemon-reload sudo systemctl enable --now hello.service systemctl status hello.service
daemon-reload 让 systemd 重新读取配置;enable 设置开机自启,--now 则表示同时立即启动。状态显示 active (running) 就说明成功了。
四、查看日志与排错
systemd 会把标准输出统一交给 journald 管理,用下面的命令即可实时查看:
journalctl -u hello.service -f
如果服务启动失败,先看 systemctl status 里的报错,常见原因有三类:脚本没有执行权限、ExecStart 写成了相对路径、运行用户对目录没有读写权限。修改 service 文件后,别忘了再执行一次 daemon-reload 并 restart。
五、小结
掌握 systemctl 的 start、stop、restart、enable、disable、status 六个子命令,再配合 journalctl 看日志,就能管理绝大多数后台程序。后续你可以把这个模板用在自己的 Web 服务、定时采集脚本或者 AI 模型推理服务上。希望这篇入门笔记对刚学 Linux 的朋友有帮助,欢迎在评论区交流。
- 点赞
- 收藏
- 关注作者
评论(0)