Bài 04: Quản lý service với systemd

Chốt ý nhanh

Chủ đề Điểm cần nhớ
systemd Là bộ quản lý service phổ biến trên Linux hiện đại.
systemctl Dùng để start, stop, restart, reload, enable và kiểm tra trạng thái service.
Phản xạ đúng Khi service lỗi, đọc status và journal trước khi restart bừa.

Bài 04: Quản lý service với systemd

Bài này giúp anh quản lý service Linux bằng systemd: start, stop, restart, enable, kiểm tra trạng thái và đọc log đúng cách.

Sau bài này anh sẽ biết:

  • Service là gì và systemd quản lý service ra sao.
  • Dùng systemctl để start/stop/restart/reload.
  • Phân biệt restart và reload.
  • Đọc log service bằng journalctl.

1. Service là gì?

Service là chương trình chạy nền để cung cấp chức năng: SSH cho đăng nhập từ xa, Nginx phục vụ web, MySQL lưu database, cron chạy tác vụ định kỳ.

systemd là hệ thống quản lý service phổ biến trên Linux hiện đại.

2. Các lệnh systemctl quan trọng

systemctl status ssh
sudo systemctl start ssh
sudo systemctl stop ssh
sudo systemctl restart ssh
sudo systemctl reload nginx
sudo systemctl enable nginx
sudo systemctl disable nginx
systemctl is-active nginx
systemctl is-enabled nginx
Lệnh Ý nghĩa
start Chạy service ngay
stop Dừng service
restart Dừng rồi chạy lại
reload Nạp lại config nếu service hỗ trợ, ít gián đoạn hơn restart
enable Tự chạy khi boot

3. Lab thực hành với SSH hoặc cron

Mục tiêu: kiểm tra trạng thái service và đọc log mà không phá hệ thống.
systemctl status ssh || systemctl status sshd
systemctl is-active ssh || systemctl is-active sshd
journalctl -u ssh --since "1 hour ago" || journalctl -u sshd --since "1 hour ago"

Một số distro gọi service SSH là ssh, một số gọi là sshd.

4. Đọc trạng thái service

Khi chạy systemctl status nginx, anh cần chú ý:

  • Loaded: service unit có tồn tại không, có enabled không.
  • Active: đang active/running hay failed.
  • Main PID: process chính.
  • Log cuối: vài dòng lỗi gần nhất.

5. Đọc log bằng journalctl

journalctl -u nginx --since "30 minutes ago"
journalctl -u nginx -f
journalctl -p err --since "today"
systemctl --failed

-f giống “theo dõi trực tiếp”. -p err lọc lỗi mức error trở lên.

6. Tình huống thực tế: Nginx reload lỗi

sudo nginx -t
sudo systemctl reload nginx
systemctl status nginx
journalctl -u nginx --since "10 minutes ago"

Quy trình đúng là test config trước bằng nginx -t, sau đó mới reload. Nếu reload lỗi, đọc status và journalctl.

7. Lỗi thường gặp

  • Restart service liên tục mà không đọc log.
  • Quên enable, reboot xong service không tự chạy.
  • Dùng restart khi reload là đủ, gây gián đoạn không cần thiết.
  • Không kiểm tra config trước khi reload.
Lưu ý production: Với SSH, luôn giữ một phiên đang đăng nhập trước khi restart/reload để tránh tự khóa khỏi server.

8. Checklist khi service lỗi

  1. systemctl status service
  2. journalctl -u service --since "30 minutes ago"
  3. Kiểm tra config syntax nếu service hỗ trợ.
  4. Kiểm tra port có listen không bằng ss -tulpn.
  5. Restart/reload sau khi hiểu nguyên nhân.

9. Bài tập

  1. Chạy systemctl --failed và ghi lại có service nào failed không.
  2. Chọn một service an toàn để xem status.
  3. Đọc log service đó trong 1 giờ gần nhất.
  4. Giải thích khác nhau giữa enable và start.

Kết bài

Nếu bài này ngấm, anh sẽ bắt đầu nhìn service theo tư duy vận hành thay vì chỉ như một tiến trình “đang chạy hay không”. Một SysAdmin tốt không dừng ở chuyện biết restart service, mà phải biết đọc trạng thái, hiểu unit file, xem log và suy luận nguyên nhân lỗi. Bài tiếp theo sẽ nối rất tự nhiên sang package management, tức là quản lý phần mềm mà service đang phụ thuộc.

Phần thực hành mở rộng: systemd qua các ca vận hành hằng ngày

Nếu chỉ học systemctl start/stop/restart thì chưa đủ. Sysadmin thật thường dùng systemd để kiểm tra boot, theo dõi service lỗi, bật tự khởi động và đọc log khi incident xảy ra.

Lab 1: Quan sát service đang chạy

systemctl list-units --type=service --state=running | head -30
systemctl status ssh --no-pager
systemctl status cron --no-pager

Khi đọc systemctl status, hãy chú ý:

  • Loaded: service file có tồn tại và có enable không
  • Active: trạng thái hiện tại
  • PID chính
  • Các dòng log gần nhất

Lab 2: Stop, start, restart một service an toàn

Nếu máy có nginx:

sudo systemctl status nginx --no-pager
sudo systemctl restart nginx
sudo systemctl status nginx --no-pager

Nếu chưa có nginx, có thể dùng cron hoặc ssh chỉ để xem trạng thái, không nên stop SSH trên máy remote nếu chưa hiểu hậu quả.

Lab 3: Enable và disable service lúc boot

systemctl is-enabled ssh
sudo systemctl enable ssh
systemctl is-enabled ssh

Nếu thử với một service test tự tạo, anh sẽ hiểu rõ khác biệt giữa:

  • start: chạy ngay bây giờ
  • enable: tự chạy khi boot

Lab 4: Xử lý service fail và đọc log

Tạo một service lỗi có chủ đích để học cách debug:

cat <<'EOF' | sudo tee /etc/systemd/system/demo-fail.service
[Unit]
Description=Demo failing service

[Service]
Type=simple
ExecStart=/bin/false
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start demo-fail.service
systemctl status demo-fail.service --no-pager
journalctl -u demo-fail.service -n 50 --no-pager

Anh sẽ thấy trạng thái failed hoặc restart loop. Đây là lab rất tốt để học cách đọc log systemd mà không sợ làm hỏng production.

Lab 5: Tạo service chạy script riêng

cat <<'EOF' > /tmp/hello-service.sh
#!/usr/bin/env bash
echo "$(date) hello from service" >> /tmp/hello-service.log
sleep 30
EOF
chmod +x /tmp/hello-service.sh
cat <<'EOF' | sudo tee /etc/systemd/system/hello-demo.service
[Unit]
Description=Hello Demo Service
After=network.target

[Service]
Type=simple
ExecStart=/tmp/hello-service.sh

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start hello-demo.service
systemctl status hello-demo.service --no-pager
cat /tmp/hello-service.log

Bài này giúp người mới hiểu service không phải thứ gì quá “ma thuật”; nó chỉ là cách systemd quản lý tiến trình, phụ thuộc, khởi động lại và log.

Tình huống thực tế

Sau khi deploy, ứng dụng báo down. Sysadmin thường làm đúng thứ tự:

  1. systemctl status ten-service
  2. journalctl -u ten-service
  3. Kiểm tra file config, cổng mạng, quyền file
  4. Chỉ restart khi đã hiểu tương đối nguyên nhân

Restart bừa có thể làm mất manh mối hoặc tạo outage dài hơn.

Lỗi phổ biến

  • Nhầm enable với start.
  • Chỉnh file unit xong quên daemon-reload.
  • Chỉ nhìn “service failed” mà không đọc journal.
  • Restart liên tục mà không điều tra root cause.

Bài tập thêm

  1. Tạo một service script đơn giản của riêng anh.
  2. Cho service tự restart khi fail.
  3. Cố tình sửa sai ExecStart để quan sát lỗi.
  4. Ghi lại các bước debug bằng runbook ngắn.

Phần đào sâu thêm: systemd theo góc nhìn sự cố production

Trong hệ thống thật, systemd không chỉ để start/stop. Nó là nơi anh nhìn thấy service sống hay chết, có tự boot không, có restart loop không, phụ thuộc network hay filesystem nào.

Lab bổ sung: đọc unit file đang dùng

systemctl cat ssh
systemctl cat cron

Khi đọc unit file, hãy chú ý:

  • ExecStart chạy lệnh gì
  • After phụ thuộc thứ tự khởi động nào
  • Restart có tự bật lại khi fail không

Lab bổ sung: phân biệt failed, inactive, disabled

systemctl --failed
systemctl list-unit-files --type=service | head -30

Ba trạng thái này rất hay bị nhầm:

  • failed: có lỗi khi chạy
  • inactive: hiện tại không chạy
  • disabled: không tự start lúc boot

Runbook ngắn khi service down

  1. systemctl status service-name
  2. journalctl -u service-name -n 100
  3. Kiểm tra config, port, permission, dependency
  4. Chỉ restart sau khi đã có giả thuyết nguyên nhân
  5. Xác nhận lại bằng status và test service từ bên ngoài

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *