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.
- 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
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.
8. Checklist khi service lỗi
systemctl status servicejournalctl -u service --since "30 minutes ago"- Kiểm tra config syntax nếu service hỗ trợ.
- Kiểm tra port có listen không bằng
ss -tulpn. - Restart/reload sau khi hiểu nguyên nhân.
9. Bài tập
- Chạy
systemctl --failedvà ghi lại có service nào failed không. - Chọn một service an toàn để xem status.
- Đọc log service đó trong 1 giờ gần nhất.
- 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ôngActive: 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ự:
systemctl status ten-servicejournalctl -u ten-service- Kiểm tra file config, cổng mạng, quyền file
- 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
enablevớistart. - 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
- Tạo một service script đơn giản của riêng anh.
- Cho service tự restart khi fail.
- Cố tình sửa sai
ExecStartđể quan sát lỗi. - 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ú ý:
ExecStartchạy lệnh gìAfterphụ thuộc thứ tự khởi động nàoRestartcó 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
systemctl status service-namejournalctl -u service-name -n 100- Kiểm tra config, port, permission, dependency
- Chỉ restart sau khi đã có giả thuyết nguyên nhân
- Xác nhận lại bằng status và test service từ bên ngoài
