跳到正文
马克工具箱

systemd 服务文件生成器

想让 Node.js、Python、Go 程序在 Linux 服务器上常驻运行、开机自启、崩溃后自动重启,又记不住 systemd 的各种选项?填写启动命令和运行用户,选好重启策略和环境变量,就能复制 .service 文件和安装启动命令。勾选「定时运行」还会生成 .timer,可以代替 cron 做定时任务。

在浏览器本地运行,输入的内容和文件都不会上传

也是文件名,例如 myapp → myapp.service

程序要写完整路径,例如 /usr/bin/python3 app.py

命令在前台一直运行(大多数 Web 应用和脚本)。

每行一个 KEY=value,值里有空格会自动加引号。

0 表示用系统默认值。

myapp.service

安装并启动

在服务器上以 root 粘贴运行这些命令。修改单元文件后要再执行一次 systemctl daemon-reload。查看日志:journalctl -u <名称>。

使用步骤

  1. 填写服务名称、带完整路径的启动命令和工作目录。
  2. 设置运行用户、自动重启方式和环境变量。
  3. 需要的话打开基本加固,或者填写时间表(OnCalendar)生成定时器。
  4. 复制生成的文件,或者把安装命令粘贴到服务器的 root 终端里执行。

参数说明

类型(Type)
simple 适合一直在前台运行的程序;oneshot 适合执行一次就结束的脚本,例如定时任务。
自动重启
「异常退出时」在程序报错退出或崩溃时重启;「总是」连正常退出也会重启。
OnCalendar
定时器什么时候触发,例如 daily,或 *-*-* 03:00:00 表示每天凌晨 3 点。可以用 systemd-analyze calendar 检查写法。

示例:把每晚任务做成定时器

要让脚本每晚凌晨 3 点运行,把「启动命令(ExecStart)」设为 /usr/local/bin/backup.sh,服务名称设为 backup,「类型(Type)」设为 oneshot,「自动重启」设为「不重启」,然后勾选「定时运行(同时生成 .timer)」和「基本加固」。用默认的运行用户和工作目录,生成器会产出两个文件。backup.service:

[Unit]
Description=Nightly backup

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/srv/myapp
ExecStart=/usr/local/bin/backup.sh
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=read-only

以及 backup.timer:

[Unit]
Description=Run backup on a schedule

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

开启定时器后有两处变化。服务文件不再有 [Install] 部分,因为由定时器来启动它;安装命令启用的也是定时器而不是服务:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -f

勾选定时器选项时不会替你修改「类型」,所以会执行完就结束的任务请自己选 oneshot。oneshot 服务配合「自动重启」设为「总是」是无效的,所以生成器会省略重启设置并显示警告。

常见问题

文件放在哪里?

放在 /etc/systemd/system/ 目录,然后执行 systemctl daemon-reload 和 systemctl enable --now 服务名.service。生成的命令已经包含这些步骤。

启动时报 “Executable path is not absolute” 怎么办?

旧版 systemd 要求 ExecStart 写程序的完整路径,可以用 which 查,例如 which node。

用定时器还是 cron?

定时器的日志进 journal,能补跑关机期间错过的任务,也不会重复并发执行;cron 写一行就行,简单场景照样好用。

隐私说明

本工具完全在浏览器中运行,文件和文本都在你的设备上处理,不会上传到我们的服务器。

相关工具