systemd và Dịch Vụ
Trên server Linux, các dịch vụ chạy nền (web server, database, ứng dụng của bạn) được quản lý bởi systemd — init system của hầu hết distro hiện đại (Ubuntu, Debian, Fedora, RHEL...). Biết systemd là cách bạn bật/tắt dịch vụ, cho chúng tự chạy khi server khởi động, và xem log khi chúng lỗi.
Lưu ý môi trường (quan trọng): systemd là tiến trình PID 1 của cả hệ thống, nên nó không chạy trong container thường (PID 1 của container là tiến trình bạn khởi động — ta đã kiểm chứng: trong container Ubuntu,
systemctlcòn không có sẵn). Để thực hành bài này, hãy dùng một máy ảo Linux (Multipass, VirtualBox) hoặc một VPS/instance cloud — đó cũng đúng là nơi bạn gặp systemd trong thực tế. Có cách chạy systemd trong container (image chuyên dụng +--privileged) nhưng rườm rà; VM trực quan hơn.
systemd là gì
Khi Linux khởi động, nhân chạy một tiến trình đầu tiên (PID 1) gọi là init system, và nó chịu trách nhiệm khởi động + quản lý mọi thứ còn lại. systemd là init system phổ biến nhất hiện nay.
systemd quản lý mọi thứ dưới dạng unit. Loại unit hay gặp nhất là service (.service) — một tiến trình nền. Còn có .socket, .timer (thay cron — Bài 17), .mount... nhưng service là cái bạn dùng nhiều nhất.
systemctl: điều khiển dịch vụ
systemctl là lệnh chính để làm việc với systemd:
systemctl status nginx # trạng thái dịch vụ (đang chạy? lỗi? log gần đây)
systemctl start nginx # khởi động ngay
systemctl stop nginx # dừng
systemctl restart nginx # dừng rồi chạy lại (áp dụng cấu hình mới)
systemctl reload nginx # nạp lại cấu hình mà không dừng hẳn (nếu dịch vụ hỗ trợ)
(Các lệnh này thường cần sudo — Bài 12.)
systemctl status là lệnh bạn chạy nhiều nhất khi gỡ lỗi:
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; ...)
Active: active (running) since ...
Main PID: 1234 (nginx)
Đọc nhanh: Active: active (running) = đang chạy; enabled = sẽ tự chạy khi boot. Nếu failed, phần dưới hiện vài dòng log lỗi gần nhất — manh mối đầu tiên để gỡ.
start/enable: khác nhau quan trọng
Đây là phân biệt cốt lõi của systemd (giống cặp update/upgrade ở Bài 11):
start— chạy dịch vụ ngay bây giờ. Nhưng nếu server khởi động lại, nó không tự chạy.enable— đăng ký để dịch vụ tự chạy mỗi khi boot. Nhưng không khởi động nó ngay lúc này.
Vì vậy để dịch vụ vừa chạy ngay vừa tự chạy sau reboot, làm cả hai (hoặc dùng --now):
systemctl enable --now nginx # enable + start trong một lệnh
systemctl disable --now nginx # disable + stop
Lỗi kinh điển: start một dịch vụ, mọi thứ ổn, nhưng quên enable — server reboot là dịch vụ biến mất. Nhớ: start = chạy bây giờ, enable = tự chạy khi boot.
Viết unit file của riêng bạn
Để chạy ứng dụng của bạn như một dịch vụ systemd (tự khởi động lại khi crash, tự chạy khi boot — thay cho nohup & ở Bài 8), tạo một file .service. Ví dụ /etc/systemd/system/myapp.service:
[Unit]
Description=My App
After=network.target
[Service]
ExecStart=/usr/bin/node /opt/myapp/server.js
WorkingDirectory=/opt/myapp
User=appuser
Restart=on-failure
[Install]
WantedBy=multi-user.target
Đọc các khối:
- [Unit] — mô tả và thứ tự:
After=network.targetnghĩa là chạy sau khi mạng sẵn sàng. - [Service] — cách chạy:
ExecStartlà lệnh khởi động,Userlà user chạy (nên là user riêng, không phải root — Bài 12),Restart=on-failuređể systemd tự khởi động lại khi app crash. Đây là lợi ích lớn so vớinohup. - [Install] —
WantedBy=multi-user.targetđểenablegắn nó vào quá trình boot bình thường.
Sau khi tạo/sửa unit file, nạp lại rồi bật:
systemctl daemon-reload # bắt systemd đọc lại unit file
systemctl enable --now myapp
daemon-reload là bước hay quên — sửa unit file mà không reload thì systemd vẫn dùng bản cũ.
journalctl: xem log của dịch vụ
systemd thu thập log của mọi dịch vụ vào một nơi (journal), xem bằng journalctl:
journalctl -u nginx # log của dịch vụ nginx
journalctl -u nginx -f # theo dõi log mới theo thời gian thực (như tail -f)
journalctl -u nginx --since "10 min ago" # log 10 phút gần đây
journalctl -p err -b # chỉ log mức error, trong lần boot này (-b)
journalctl -u <dịch vụ> -f là cặp đôi vàng với systemctl status khi gỡ lỗi: status cho biết dịch vụ sống/chết, journalctl cho biết vì sao.
Nhớ Bài 10 — journal có thể ngốn đĩa. Giới hạn bằng
journalctl --vacuum-size=200Mhoặc cấu hình trong/etc/systemd/journald.conf.
🧹 Dọn dẹp
Nếu thực hành trên VM và đã tạo dịch vụ thử:
systemctl disable --now myapp
rm /etc/systemd/system/myapp.service
systemctl daemon-reload
Tổng kết
systemd là init system quản lý dịch vụ trên Linux hiện đại; mỗi dịch vụ là một unit .service. systemctl điều khiển: start/stop/restart, và phân biệt start (chạy ngay) với enable (tự chạy khi boot) — dùng enable --now cho cả hai. Bạn chạy ứng dụng riêng như dịch vụ bằng một unit file (với Restart=on-failure để tự hồi phục), nhớ daemon-reload sau khi sửa. journalctl -u <dịch vụ> xem log. Vì systemd là PID 1, hãy thực hành trên VM/server thật chứ không phải container.
Bài 16 chuyển sang tự động hóa: shell scripting — gom các lệnh thành script có biến, điều kiện, vòng lặp, để khỏi gõ lại và để tự động hóa công việc.