Chạy một dịch vụ theo khoảng thời gian cố định trên Debian

Có nhiều cách để chạy một dịch vụ theo khoảng thời gian cố định trên Debian như: cron, anacron, systemd timers, at, sleep loop.

1. Tạo script (nếu chưa có)

Đảm bảo rằng bạn đã có sẵn script của mình. Ví dụ wg-auto-reconnect.sh như ở cuối bài viết:

sudo nano /usr/local/bin/wg-auto-reconnect.sh

Dán nội dung script vào và cấp quyền thực thi cho nó:

sudo chmod +x /usr/local/bin/wg-auto-reconnect.sh

2. Tạo một dịch vụ Systemd

Tạo một file dịch vụ systemd cho script.

sudo nano /etc/systemd/system/wg-auto-reconnect.service

Dán nội dung sau vào:

[Unit]
Description=Auto reconnect WireGuard if no internet connection

[Service]
Type=simple
ExecStart=/usr/local/bin/wg-auto-reconnect.sh

3. Tạo một Timer Systemd

Bây giờ, tạo một file timer của systemd để kích hoạt dịch vụ theo khoảng thời gian mong muốn.

sudo nano /etc/systemd/system/wg-auto-reconnect.timer

Thêm nội dung sau:

[Unit]
Description=Chạy script tự động kết nối lại WireGuard mỗi 10 phút

[Timer]
OnBootSec=3min          # chay-3-phut-sau-khi-khoi-djong-he-thong
OnUnitActiveSec=10min    # chay-moi-10-phut-sau-lan-thuc-thi-cuoi-cung

[Install]
WantedBy=timers.target

Trong ví dụ này:

  • OnBootSec=3min có nghĩa là timer sẽ chạy sau 3 phút kể từ khi hệ thống khởi động.
  • OnUnitActiveSec=10min có nghĩa là script sẽ được chạy mỗi 10 phút sau khi nó được thực thi lần cuối.

4. Kích hoạt và khởi động Timer

Tải lại daemon systemd để nhận diện dịch vụ và timer mới:

sudo systemctl daemon-reload

Kích hoạt và khởi động timer:

sudo systemctl enable wg-auto-reconnect.timer
sudo systemctl start wg-auto-reconnect.timer

5. Kiểm tra trạng thái của Timer

Để đảm bảo timer đang hoạt động, bạn có thể kiểm tra trạng thái của nó:

sudo systemctl status wg-auto-reconnect.timer

Lệnh này sẽ hiển thị thời gian cuối cùng script được chạy và khi nào nó sẽ chạy tiếp theo.

6. Kích hoạt thủ công

Nếu bạn muốn kiểm tra script ngay lập tức mà không cần chờ timer, bạn có thể kích hoạt dịch vụ thủ công:

sudo systemctl start wg-auto-reconnect.service

Script (wg-auto-reconnect.sh)

  • check_internet: Hàm này sử dụng lệnh ping đến máy chủ DNS của Google (8.8.8.8) để kiểm tra xem có kết nối internet đang hoạt động hay không.
  • check_wireguard: Hàm này kiểm tra xem WireGuard (wg0) có đang hoạt động không bằng cách sử dụng systemctl.
  • Nếu có kết nối internet và WireGuard đã đang chạy, script sẽ kết thúc.
  • Nếu WireGuard không hoạt động nhưng có kết nối internet, script sẽ khởi động WireGuard.
  • Nếu không có kết nối internet, WireGuard sẽ bị tắt, script sẽ chờ 3 giây và sau đó kiểm tra lại kết nối. Nếu internet hoạt động trở lại, WireGuard sẽ được bật lên.
  • Nếu không tìm thấy kết nối sau lần kiểm tra thứ hai, script sẽ kết thúc. Script này sẽ đảm bảo WireGuard được quản lý hợp lý tùy theo tình trạng kết nối internet và trạng thái của dịch vụ.