linux服务可通过systemd依赖机制实现按需启动:网络就绪用after=network-online.target;文件变化用.path单元;套接字连接用.socket单元;定时任务用.timer单元。
linux 服务在特定条件下触发启动,核心是利用 systemd 的依赖机制和触发器单元(.target、.path、.socket、.timer 等),而非简单“开机就跑”。systemd 不仅支持开机自启,还能实现按需启动(on-demand)、事件驱动(如文件变化、网络就绪、定时、套接字连接)等精细化控制。
按网络就绪后启动(After=network.target 或 After=network-online.target)
很多服务依赖网络可用(比如要连远程 API 或数据库),但默认的 network.target 只表示“网络服务已启动”,不保证 IP 配置完成或网关可达;若需真正联网后再启动,应使用 network-online.target:
- 在
[Unit]段中写:After=network-online.target和Wants=network-online.target - 确保
systemd-networkd-wait-online.service已启用(多数发行版默认启用);否则network-online.target可能永不就绪 - 示例:你的服务需调用公网 DNS,就该等网络真正在线,而不是仅网卡 up
监听文件或目录变化后启动(.path 单元)
适合“有新日志就处理”“收到上传文件就转码”这类场景。它不常驻内存,只在路径事件发生时拉起一次服务:
- 新建
/etc/systemd/system/watch-upload.path:
[Unit] Description=Watch for new files in /var/www/uploads [Path] PathChanged=/var/www/uploads Unit=process-upload.service [Install] WantedBy=multi-user.target
- 对应创建
process-upload.service,Type=oneshot+RemainAfterExit=yes(可选,用于标记任务完成) - 启用:
sudo systemctl enable watch-upload.path(注意是 .path 文件,不是 .service) - systemd 会自动监控 inotify 事件,无需额外守护进程
响应套接字连接启动(.socket 单元)
典型用于延迟加载、节省资源,如 SSH、Docker、自定义 HTTP 服务。首次连接时才启动主服务,后续连接复用:
- 写
myapp.socket,声明监听地址和端口(如ListenStream=127.0.0.1:8080) - 在
[Socket]中设Service=myapp.service,指向实际服务单元 - 服务单元中必须设
Type=simple或Type=notify,且ExecStart要能接收已打开的 socket 文件描述符(通常通过$LISTEN_FDS和$LISTEN_PID环境变量) - 启用 socket 单元:
sudo systemctl enable myapp.socket;服务本身不用 enable
定时条件触发(.timer 单元)
不仅支持“每天 3 点执行”,还可设为“系统启动 5 分钟后首次运行,之后每小时一次”,或“上次执行成功后 10 分钟再运行”:
- 写
backup.timer,用OnBootSec=5min+OnUnitActiveSec=1h - 搭配
backup.service,注意 service 中不要设Restart=(timer 控制周期,重启逻辑由 timer 管理) - 启用 timer:
sudo systemctl enable backup.timer;status 查看下次触发时间:systemctl list-timers - 比 crontab 更强:能感知系统休眠、跳过错失时机、与服务状态联动











