《别再靠 nohup 了:用 systemd 把自己的脚本变成开机自启的系统服务》

举报
yd_214534406 发表于 2026/11/06 13:22:37 2026/11/06
【摘要】 自己写的小脚本、小工具,刚开始跑起来往往很随意:SSH 登录上去,nohup 一挂,终端一关,看着还在跑就收工了。问题是这种跑法经不起事——机器一重启,服务不会自己回来;进程半夜挂了,没人拉它起来;想看日志,得满世界找当时重定向到了哪个文件。用 systemd 把脚本注册成一个正经的系统服务,这些问题一次就都解决了,而且成本只是一个十几行的配置文件。一、一个最小可用的 service 文件长...

自己写的小脚本、小工具,刚开始跑起来往往很随意:SSH 登录上去,nohup 一挂,终端一关,看着还在跑就收工了。问题是这种跑法经不起事——机器一重启,服务不会自己回来;进程半夜挂了,没人拉它起来;想看日志,得满世界找当时重定向到了哪个文件。用 systemd 把脚本注册成一个正经的系统服务,这些问题一次就都解决了,而且成本只是一个十几行的配置文件。

一、一个最小可用的 service 文件长什么样

在 /etc/systemd/system/ 目录下新建一个文件,比如 mytool.service,内容分三段:

[Unit] 段写说明和启动顺序。Description 写一句这个服务是干什么的;After=network.target 表示等网络就绪后再启动,需要联网的脚本少了这一行,很容易在开机时因为网络还没通而失败。

[Service] 段是核心。ExecStart 写启动命令,必须用绝对路径,systemd 不读你的 shell 配置,相对路径和环境变量里的简写都不认。WorkingDirectory 指定工作目录,脚本里用到相对路径读配置文件时,没这一行就会在根目录下找不到文件。Restart=on-failure 表示进程异常退出时自动拉起,RestartSec 写个 5 秒,避免挂了立刻反复重启打满日志。User 可以指定用哪个用户跑,能不用 root 就不用 root。

[Install] 段写 WantedBy=multi-user.target,这是开机自启的关键,没有这一段,enable 时不会挂到启动目标上。

文件写完,依次执行 systemctl daemon-reload 让 systemd 重新读配置,systemctl enable --now mytool 一次完成“设为自启 + 立刻启动”。以后改了 service 文件,必须先 daemon-reload 再 restart,忘了 reload 是新手最常见的坑,改了配置却不生效,多半就是它。

二、自启只是开始,这几个状态命令要熟

服务注册完,日常打交道的就是几个命令:systemctl status mytool 看是否在跑、上次退出码是什么;journalctl -u mytool -f 实时跟它的日志——只要脚本是往标准输出打字的,日志就自动被 journald 收走,不用再自己管日志文件;systemctl restart / stop 做启停;出了问题先看 status 最后几行和 journal 的完整记录,比自己猜要快得多。

有个细节值得注意:脚本要以前台方式运行。有些程序有“转入后台”的参数或者自己会 fork,交给 systemd 管时千万别开——systemd 靠主进程判断服务死活,主进程一退出,它就认为服务停了,轻则状态显示不对,重则配合 Restart 反复拉起、越拉越多。默认的 Type=simple 就是假设 ExecStart 的进程本身就是服务本体,正适合绝大多数自写脚本。

三、让服务更耐用的几个小设置

一是环境变量别写死在命令里。把配置放进一个 EnvironmentFile 指向的文件,改配置不用动 service 文件,也不会把密钥之类的内容散落在进程列表里。

二是失败别无限重试。Restart=on-failure 很好用,但一个注定起不来的服务无限重启,只会把日志和 CPU 吃光。可以配合 StartLimit 之类的限制,让它连挂几次后停下来等人工处理,至少状态一眼能看出“它真的坏了”。

三是日志要设上限。journald 的日志默认有全局上限,但单个话痨服务能把别人的日志都挤掉。定期用 journalctl --disk-usage 看一眼占用,必要时在 journald 配置里设好 SystemMaxUse,心里有数。

小结

把脚本交给 systemd,换来的是开机自启、挂了自动拉起、日志统一收集、启停状态一条命令看清。配置文件就十几行,写一次管很久。凡是打算长期跑的自写工具,都值得花这十分钟注册成服务,而不是靠 nohup 和运气续命。

(本文为个人运维实践记录。)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。