很多人写 service 只填了 ExecStart,结果进程一崩就再也起不来,或者日志找不到。下面是一份我常用的最小可靠模板。
[Unit]
Description=my daemon
After=network.target network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mydaemon -config /etc/mydaemon/config.json
Restart=on-failure
RestartSec=3
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
no:默认,退出后不重启。on-failure:非正常退出(非 0、被信号杀死、超时)才重启;正常 stop 不重启,适合大多数服务。always:无论怎么退出都重启,连你手动 stop 之后也会被拉起——要注意别和 systemctl stop 打架。代理、Web、数据库这类要扛大量连接的程序,默认 1024 的文件描述符上限很容易打满,表现为 accept: too many open files。显式调大到几十万甚至百万更稳妥。
systemctl status mydaemon --no-pager -l
journalctl -u mydaemon -n 50 --no-pager
journalctl -u mydaemon -f # 实时跟踪
常见坑:路径写成相对路径、工作目录不对、配置文件权限导致读取失败。Type=simple 的程序务必前台运行,不要自己 daemonize,否则 systemd 会误判进程已退出。
改完 unit 文件记得systemctl daemon-reload,再restart。
— 本文为个人运维笔记,如有疏漏欢迎指正。