返回> 网站首页
linux程序改成 systemd 服务
yoours2026-10-19 19:45:28
简介一边听听音乐,一边写写文章。
1. 程序用 printf 打日志到终端
systemd 会自动把 stdout/stderr 收到 journal 里,使用命令 journalctl -u 服务名 -f 查看
2. 程序用相对路径读配置文件
在 .service 里加 WorkingDirectory=/opt/myapp 就行
3. 推荐的服务写法
[Unit]
Description=My App
After=network.target
#网络在线后启动
#After=network-online.target
#Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
#如果 300 秒内连续崩溃 5 次,systemd 会停止重启并标记为失败,避免死循环拖垮系统。
#StartLimitIntervalSec=300
#StartLimitBurst=5
#日志长期保留
#StandardOutput=append:/data/myapp/app.log
#StandardError=append:/data/myapp/app.log
#指定用户、组运行
#User=myapp
#Group=myapp
[Install]
WantedBy=multi-user.target
注意:
1. ExecStart 必须写绝对路径,不能写 ./myapp 或 myapp。
2. 不要自己重定向日志,比如 ExecStart=/opt/myapp/myapp > /var/log/app.log,这种 shell 语法 systemd 不认,要包一层 bash -c,或者直接用 journal。
3. 程序崩溃后 systemd 能自动重启,前提是配了 Restart=on-failure,这比 nohup 稳得多。
4. 简单说:程序本身不用改,只要它能前台常驻运行就行。唯一要改的是写一个 .service 配置文件。
4. 把服务文件拷贝过去,文件名以 .service 结尾
sudo cp myapp.service /etc/systemd/system/myapp.service
5. 然后设置权限(建议 644)
sudo chmod 644 /etc/systemd/system/myapp.service
6. 重载配置
sudo systemctl daemon-reload
让 systemd 重新读取 /etc/systemd/system/ 下的配置文件。
7. 设为开机自启
sudo systemctl enable myapp.service
在 /etc/systemd/system/multi-user.target.wants/ 下创建一个符号链接,指向你的 .service 文件。
注意:enable 只是设置开机自启,不会立即启动服务。
8. 立即启动
sudo systemctl start myapp.service
9. 重启服务
sudo systemctl restart myapp.service
10. 验证状态
# 查看当前运行状态
sudo systemctl status myapp.service
# 查看是否已设为开机自启
sudo systemctl is-enabled myapp.service
status 输出中看到 active (running) 说明正在跑;is-enabled 输出 enabled 说明开机自启已生效。