Chuyển đến nội dung
ToolMug

Tạo file service systemd

Giữ chương trình Node.js, Python hay Go luôn chạy trên máy chủ Linux, tự khởi động khi bật máy và tự chạy lại khi bị sập — mà không cần nhớ từng tùy chọn của systemd. Nhập lệnh và người dùng, chọn chính sách khởi động lại và biến môi trường, rồi sao chép file .service cùng các lệnh để cài đặt và khởi động. Chọn Chạy theo lịch (tạo .timer) để có .timer, một lựa chọn hiện đại thay cho cron.

Chạy trong trình duyệt — không có dữ liệu nào bạn nhập bị tải lên

Trở thành tên tệp, ví dụ myapp → myapp.service

Dùng đường dẫn đầy đủ đến chương trình, ví dụ /usr/bin/python3 app.py

Lệnh chạy liên tục ở foreground (phần lớn ứng dụng web và script).

Mỗi dòng một KEY=value; giá trị có khoảng trắng sẽ được tự động đặt trong dấu nháy.

0 giữ nguyên mặc định của hệ thống.

myapp.service

Cài đặt và khởi động

Dán các lệnh trên máy chủ với quyền root. Sau khi sửa tệp unit, hãy chạy lại systemctl daemon-reload. Nhật ký: journalctl -u <tên>.

Cách sử dụng

  1. Nhập tên dịch vụ, lệnh kèm đường dẫn đầy đủ và thư mục làm việc.
  2. Đặ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ó.
  3. 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.
  4. 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.

Công cụ liên quan