systemd 单元配置实战:常驻服务、定时任务,以及跑在容器里的命令

一个后台程序要一直跑着,挂了自动拉起来;另一个程序要每 10 分钟跑一次,跑完就退出。这两件事在 Linux 上都归 systemd 管,前者写成 .service,后者要 .service + .timer 一对。 本文把这两种单元的每个字段拆开讲清楚,说明为什么定时任务用 timer 比 crontab 更合适,以及命令实际跑在 Docker 容器里时最容易踩的那个坑。 一、先分清楚 service 和 timer 很多人第一次配 timer 时会困惑:「定时任务为什么要写两个文件?」 因为这是两件事: .service 回答「这个程序该怎么跑」——跑什么命令、用哪个用户、挂了要不要重启、超时多久算失败 .timer 回答「什么时候去启动它」——每 10 分钟、每天凌晨 3 点、开机 5 分钟后 .service 是名词,.timer 是闹钟。闹钟响了就去按一下那个 service 的启动按钮,至于按下去之后发生什么,是 service 自己的事。 所以常驻型的程序只要一个 .service(它自己不停,不需要闹钟),周期型的要一对,而且两个文件必须同名:myapp-sync.service 配 myapp-sync.timer——timer 靠文件名找到对应的 service,改错一个字母就是「闹钟响了但没有任何反应」。 两种文件都放在 /etc/systemd/system/。 二、常驻型:Type=simple + Restart=always 先看一个真实的例子。一个 Python 写的后台 worker,从队列里领任务、执行、再领下一个,永远不退出: [Unit] Description=myapp 后台 worker After=network-online.target docker.service Wants=network-online.target [Service] Type=simple Environment=TZ=Asia/Shanghai WorkingDirectory=/var/www/myapp ExecStart=/var/www/myapp/.venv/bin/python -m worker Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target 逐段拆开。 ...

September 2, 2026 · 5 min · 翼橙