使用步骤
- 填写服务名称、带完整路径的启动命令和工作目录。
- 设置运行用户、自动重启方式和环境变量。
- 需要的话打开基本加固,或者填写时间表(OnCalendar)生成定时器。
- 复制生成的文件,或者把安装命令粘贴到服务器的 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 写一行就行,简单场景照样好用。
隐私说明
本工具完全在浏览器中运行,文件和文本都在你的设备上处理,不会上传到我们的服务器。