给自己的小服务写个 systemd 单元:开机自启与日志查看
自己在服务器上跑一个小服务,最怕的不是写不出来,而是机器一重启、终端一关,服务就没了,还得手动再起一次。systemd 解决的正是这个问题:把服务写成一个单元交给系统管,开机自动起、挂了按策略处理、日志也有地方集中看。
先理解一个关系:systemd 单元不是脚本本身,而是告诉系统怎么起这个服务的说明书。服务程序还是你原来的那个,单元里写清用什么用户跑、从哪个目录起、命令是什么、失败了怎么办。系统按这份说明书起服务,你就不用每次都守着终端了。
上手只要三步。第一步,在 /etc/systemd/system/ 下新建一个单元文件,比如 myapp.service,名字用英文和项目名,不要用中文和空格。文件里最关键的三段是:[Unit] 写描述和启动顺序,[Service] 写工作目录、启动命令和重启策略,[Install] 写开机自启的目标。第二步,执行 systemctl daemon-reload 让系统重新读一遍单元,再用 systemctl enable myapp 设为开机自启,用 systemctl start myapp 立刻起一次。第三步,用 systemctl status myapp 看它是不是在跑,用 journalctl -u myapp -f 实时看日志,用 journalctl -u myapp --since today 只看今天的日志。
新手最容易踩的坑有三个。第一,启动命令里不要写相对路径,工作目录和可执行文件都要写绝对路径,否则手动能跑、systemd 起就找不到文件。第二,重启策略不要一上来就写无条件一直重启,先用 on-failure,等服务本身稳定了再考虑放宽,不然一个本身就起不来的服务会在后台反复刷日志。第三,服务跑起来不代表日志就不用管,程序自己的输出要往标准输出写,这样 journalctl 才能集中收到;如果程序把日志写到各处文件里,查问题时还得满盘找。
养成一个习惯就够了:一个服务一个单元,名字写清项目,改完单元先 daemon-reload 再重启服务,出问题先看 status 再看 journalctl。这样下次机器重启,你就不用重新手动起服务,只需要确认它已经自己起来了。
- 点赞
- 收藏
- 关注作者
评论(0)