Tóm tắt: Đặt unit tự viết ở /etc/systemd/system/, chạy dưới user riêng, Restart=on-failure, env đọc từ EnvironmentFile=. Việc định kỳ dùng cặp .service (Type=oneshot) + .timer (OnCalendar=, Persistent=true). Sau mỗi lần sửa file: systemctl daemon-reload.
[Unit]Description=Net collector (gNMI -> InfluxDB)Documentation=https://example.com/netcollector# Chờ mạng thật sự có IP, không chỉ "network.target"Wants=network-online.targetAfter=network-online.target# Restart quá 5 lần trong 5 phút thì dừng hẳn (state failed)StartLimitIntervalSec=300StartLimitBurst=5[Service]Type=execUser=netcollectorGroup=netcollectorWorkingDirectory=/opt/netcollector# Dấu "-" = file không tồn tại thì bỏ qua, không lỗiEnvironmentFile=-/etc/default/netcollectorEnvironment=LOG_LEVEL=infoExecStart=/opt/netcollector/.venv/bin/python -m netcollector --config /etc/netcollector/config.ymlExecReload=/bin/kill -HUP $MAINPIDRestart=on-failureRestartSec=5# Giới hạn tài nguyên (cgroups v2)MemoryMax=512MCPUQuota=50%# Hardening cơ bảnNoNewPrivileges=yesProtectSystem=strictProtectHome=yesPrivateTmp=yesStateDirectory=netcollectorLogsDirectory=netcollector[Install]WantedBy=multi-user.target
/etc/default/netcollector
# KEY=VALUE, không có "export"; quyền 0600, owner rootINFLUX_URL=http://127.0.0.1:8086INFLUX_TOKEN=***
Directive
Ý nghĩa
Wants= / Requires=
Kéo unit khác lên cùng; Requires thì unit kia fail sẽ kéo theo unit này. Không quy định thứ tự
After= / Before=
Chỉ quy định thứ tự khởi động, thường dùng kèm Wants=
Type=simple / exec
Process chính chính là service; exec báo lỗi ngay nếu binary không chạy được
Type=forking
Daemon kiểu cũ tự fork, nên kèm PIDFile=
Type=notify
App tự báo sẵn sàng qua sd_notify
Type=oneshot
Chạy xong thoát, dùng cho job/timer
Restart=
no, on-failure, on-abnormal, always... on-failure hợp lý cho đa số app
StateDirectory=
Tạo /var/lib/<tên> thuộc User=, ghi được dù ProtectSystem=strict
sudo systemctl edit nginx # tạo /etc/systemd/system/nginx.service.d/override.confsystemctl cat nginx # xem unit gốc + mọi drop-in
/etc/systemd/system/nginx.service.d/override.conf
[Service]Restart=on-failureRestartSec=3# Với list như ExecStart= phải reset bằng dòng rỗng trước khi gán lạiExecStart=ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
[Unit]Description=Backup config thiết bị mạngWants=network-online.targetAfter=network-online.target[Service]Type=oneshotUser=netbackupEnvironmentFile=/etc/default/config-backupExecStart=/opt/netbackup/run.sh
/etc/systemd/system/config-backup.timer
[Unit]Description=Chạy config-backup 02:00 thứ Hai đến thứ Sáu[Timer]OnCalendar=Mon..Fri *-*-* 02:00:00# Máy tắt lúc đến giờ thì chạy bù khi bật lạiPersistent=trueRandomizedDelaySec=5min[Install]WantedBy=timers.target
Cron
OnCalendar=
*/15 * * * *
*:0/15
0 * * * *
hourly
0 0 * * *
daily
0 2 * * 1
Mon *-*-* 02:00:00
30 8 1 * *
*-*-01 08:30:00
Sau boot 5 phút, rồi mỗi giờ
OnBootSec=5min + OnUnitActiveSec=1h (không dùng OnCalendar)