Cách sử dụng
- Nhập tên dịch vụ, lệnh kèm đường dẫn đầy đủ và thư mục làm việc.
- Đặt người dùng, chính sách khởi động lại và các biến môi trường nếu có.
- Nếu muốn, thêm tăng cường bảo mật cơ bản hoặc lịch chạy (OnCalendar) để tạo timer.
- Sao chép các file được tạo, hoặc dán các lệnh cài đặt vào shell root trên máy chủ.
Giải thích tùy chọn
- Type
- simple phù hợp với chương trình chạy ở foreground; oneshot phù hợp với script chỉ chạy một lần, như tác vụ theo lịch.
- Restart
- Khi lỗi sẽ khởi động lại dịch vụ khi nó thoát với lỗi hoặc bị sập; Luôn luôn còn khởi động lại cả sau khi thoát bình thường.
- OnCalendar
- Thời điểm timer kích hoạt, ví dụ daily hoặc *-*-* 03:00:00 cho 3 giờ sáng mỗi ngày. Kiểm tra biểu thức bằng systemd-analyze calendar.
Ví dụ: một tác vụ hằng đêm dưới dạng timer
Để chạy một script mỗi đêm lúc 3 giờ sáng, hãy đặt Lệnh (ExecStart) là /usr/local/bin/backup.sh, tên service là backup, Type là oneshot và Restart là Never, rồi tích “Chạy theo lịch (tạo .timer)” và “Tăng cường bảo mật cơ bản”. Với người dùng và thư mục làm việc mặc định, trình tạo cho ra hai tệp. 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
và backup.timer:
[Unit]
Description=Run backup on a schedule
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
Hai điều thay đổi khi bật timer. Tệp service mất phần [Install], vì timer khởi động nó thay thế, và các lệnh cài đặt kích hoạt timer thay vì service:
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -f
Type không được tự đổi khi bạn tích tùy chọn timer, nên hãy tự chọn oneshot cho các tác vụ có kết thúc. Service oneshot kết hợp với Restart Always là không hợp lệ, nên trình tạo bỏ Restart đi và hiển thị cảnh báo.
Câu hỏi thường gặp
Tôi đặt file ở đâu?
Trong /etc/systemd/system/. Sau đó chạy systemctl daemon-reload và systemctl enable --now <tên>.service — các lệnh được tạo đã làm đủ những việc này.
Vì sao dịch vụ của tôi lỗi với “Executable path is not absolute”?
systemd bản cũ cần đường dẫn đầy đủ tới chương trình trong ExecStart. Tìm bằng which, ví dụ which node.
Nên dùng timer hay cron?
Timer ghi log vào journal, có thể chạy bù các lần bị lỡ khi máy chủ tắt và không bao giờ chạy hai lần cùng lúc. cron đơn giản hơn cho lệnh một dòng và vẫn hoạt động tốt.
Quyền riêng tư
Công cụ này chạy hoàn toàn trong trình duyệt của bạn. Tệp và văn bản được xử lý ngay trên thiết bị và không bao giờ được tải lên máy chủ của chúng tôi.