Quản lý dịch vụ với systemd: systemctl và journalctl

Gần như mọi bản phân phối Linux hiện đại đều dùng systemd để khởi động và quản lý dịch vụ. Nắm được systemctljournalctl là đủ cho phần lớn công việc.

Năm lệnh dùng mỗi ngày

systemctl status nginx     # trạng thái + vài dòng log gần nhất
systemctl start nginx      # khởi động ngay
systemctl stop nginx       # dừng
systemctl restart nginx    # dừng rồi chạy lại
systemctl reload nginx     # nạp lại cấu hình, KHÔNG ngắt kết nối

Ưu tiên reload hơn restart khi chỉ đổi cấu hình — người dùng không bị rớt kết nối.

Phân biệt enable và start

systemctl start nginx      # chạy NGAY, nhưng reboot là mất
systemctl enable nginx     # tự chạy khi khởi động, nhưng CHƯA chạy bây giờ
systemctl enable --now nginx   # cả hai

Đây là nhầm lẫn kinh điển: dịch vụ chạy ngon lành, tới khi server reboot thì biến mất vì quên enable.

Xem toàn cảnh

systemctl list-units --type=service --state=running
systemctl list-unit-files --state=enabled
systemctl --failed          # dịch vụ nào đang lỗi

Đọc log bằng journalctl

journalctl -u nginx -f              # theo dõi trực tiếp
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -p err          # chỉ mức lỗi trở lên
journalctl -b                       # log từ lần khởi động này
journalctl --disk-usage             # log đang chiếm bao nhiêu
journalctl --vacuum-time=7d         # chỉ giữ 7 ngày

Tự viết unit file

# /etc/systemd/system/myapp.service
[Unit]
Description=Ứng dụng nội bộ
After=network.target

[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/opt/myapp/.env
ExecStart=/opt/myapp/.venv/bin/python app.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload        # bắt buộc sau khi sửa unit file
systemctl enable --now myapp
journalctl -u myapp -f

Vài tùy chọn đáng thêm

  • Restart=always + RestartSec=5 — tự dựng lại khi ứng dụng chết.
  • User= — đừng chạy bằng root nếu không thật sự cần.
  • EnvironmentFile= — để secret ngoài unit file, đặt quyền 600.
  • TimeoutStopSec=30 — cho ứng dụng thời gian đóng kết nối tử tế.

Nhớ một điều duy nhất: sửa unit file xong phải daemon-reload, nếu không systemd vẫn chạy bản cũ và bạn sẽ mất cả buổi tự hỏi vì sao.

Lên đầu trang