手写一个可靠的 systemd service:Restart、LimitNOFILE 与日志

Linuxsystemd 发布于 2026-08-21 · 分类:Linux 运维 · 阅读 2,107

很多人写 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

Restart 策略

LimitNOFILE

代理、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

— 本文为个人运维笔记,如有疏漏欢迎指正。