IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series: Raspberry Pi OS – Bài 14: Quản lý service với systemctl

Trên Raspberry Pi OS, rất nhiều thành phần quan trọng chạy dưới dạng service: SSH, NetworkManager, cron, web server, MQTT client, app Python chạy nền, Node.js backend, và nhiều tiến trình khác. Công cụ chuẩn để quản lý các service này là systemctl, thuộc hệ systemd. Tài liệu systemctl chính thức mô tả đây là công cụ để kiểm tra và điều khiển trạng thái của systemd và service manager.

Mục tiêu sau bài học

Sau khi hoàn thành bài này, bạn nên đạt được các mục tiêu sau:

  • hiểu service là gì trên Raspberry Pi OS
  • biết dùng systemctl để xem trạng thái service
  • biết start, stop, restart service đúng cách
  • biết phân biệt enablestart
  • biết cách xem log khi service lỗi
  • hiểu quy trình cơ bản để tự quản lý app chạy nền trên Raspberry Pi

Service là gì?

Service là một tiến trình chạy nền, thường được hệ thống quản lý tự động. Ví dụ, khi bạn bật SSH trên Raspberry Pi, SSH server sẽ chạy như một service; khi bạn cài web server hoặc một chương trình backend, bạn cũng thường muốn nó chạy như service để tự khởi động cùng máy và dễ quản lý hơn. Trong hệ Linux hiện đại dùng systemd, các service được mô tả bằng các unit và được điều khiển bằng systemctl.

systemctl là gì?

systemctl là lệnh chính để làm việc với systemd. Theo tài liệu chính thức, nó dùng để “introspect and control” trạng thái của systemd và các unit mà systemd quản lý. Nói dễ hiểu hơn, đây là công cụ bạn dùng để:

  • xem service có đang chạy hay không
  • bật hoặc tắt service
  • cho service tự chạy khi boot
  • xem service lỗi ở đâu
  • nạp lại cấu hình service sau khi chỉnh sửa

Vì sao người dùng Raspberry Pi nên biết systemctl?

Nếu bạn chỉ dùng Raspberry Pi như desktop cơ bản, có thể bạn chưa cần systemctl quá sớm. Nhưng khi bạn bắt đầu dùng Pi cho các việc như:

  • SSH headless
  • MQTT gateway
  • web app nội bộ
  • data logger
  • Python script chạy nền
  • Node.js hoặc Flask app tự chạy khi boot

thì systemctl gần như trở thành công cụ bắt buộc phải biết. Cộng đồng Raspberry Pi cũng thường hướng người dùng chuyển sang systemd service thay vì các cách cũ như rc.local cho các app chạy nền.

Cách xem trạng thái một service

Lệnh cơ bản nhất là:

sudo systemctl status <ten-service>

Ví dụ:

sudo systemctl status ssh

hoặc:

sudo systemctl status NetworkManager

Tài liệu systemctl xác nhận status là một lệnh chuẩn để xem trạng thái hiện tại của unit. Trên Raspberry Pi Forums, đây cũng là lệnh thường được dùng đầu tiên khi cần chẩn đoán service có chạy hay không.

Cách start và stop service

Để chạy một service ngay lúc này:

sudo systemctl start <ten-service>

Để dừng nó:

sudo systemctl stop <ten-service>

Ví dụ:

sudo systemctl start ssh
sudo systemctl stop ssh

Theo tài liệu systemctl, start dùng để khởi chạy unit, còn stop dùng để dừng unit đang hoạt động. Đây là thao tác cho phiên hiện tại, không có nghĩa là service sẽ tự chạy ở lần boot sau.

Cách restart service

Khi bạn sửa cấu hình hoặc muốn khởi động lại service, dùng:

sudo systemctl restart <ten-service>

Ví dụ:

sudo systemctl restart ssh

restart rất hữu ích khi bạn chỉnh file config của ứng dụng hoặc service mà không muốn reboot toàn bộ Raspberry Pi. Tài liệu systemd cũng phân biệt rõ giữa việc tự khởi động lại do Restart= trong unit file và việc bạn chủ động gọi systemctl restart.

enable khác gì start?

Đây là chỗ người mới rất hay nhầm.

start

sudo systemctl start myapp.service

Lệnh này chỉ làm service chạy ngay bây giờ.

enable

sudo systemctl enable myapp.service

Lệnh này cấu hình để service tự khởi động ở lần boot sau.

Tài liệu systemd.unit nói rõ rằng khi chạy enable, systemd sẽ tạo các symlink cần thiết để gắn unit vào target khởi động phù hợp. Trên Raspberry Pi Forums, các moderator cũng giải thích rất trực tiếp: enable là cho lần boot tiếp theo, còn start là cho phiên đang chạy.

Cách dùng enabledisable

Để bật tự khởi động cùng hệ thống:

sudo systemctl enable <ten-service>

Để bỏ tự khởi động:

sudo systemctl disable <ten-service>

Ví dụ:

sudo systemctl enable ssh
sudo systemctl disable ssh

Đây là cặp lệnh rất quan trọng khi bạn muốn quyết định app nào nên tự chạy lúc boot và app nào chỉ chạy khi cần.

Cách kiểm tra service có bật tự khởi động không

Bạn có thể dùng:

systemctl is-enabled <ten-service>

và để kiểm tra nó có đang chạy không:

systemctl is-active <ten-service>

Các lệnh này thuộc nhóm truy vấn trạng thái của systemctl, rất tiện khi bạn muốn script hóa việc kiểm tra hoặc chỉ cần câu trả lời ngắn gọn như enabled, disabled, active, inactive.

Khi service lỗi thì xem gì trước?

Thứ đầu tiên gần như luôn nên xem là:

sudo systemctl status <ten-service>

Lệnh này thường cho bạn biết:

  • service đang active hay failed
  • file unit nào được dùng
  • lệnh nào đã được chạy
  • mã thoát cơ bản
  • một phần log gần nhất

Cả tài liệu systemctl lẫn nhiều thảo luận trên Raspberry Pi Forums đều xem systemctl status là bước chẩn đoán đầu tiên khi service không hoạt động đúng.

Xem log chi tiết của service

Khi status chưa đủ, bạn nên xem log bằng journalctl:

sudo journalctl -u <ten-service>

Ví dụ:

sudo journalctl -u ssh

hoặc xem log mới nhất theo thời gian thực:

sudo journalctl -u <ten-service> -f

Vì systemd và journald đi cùng nhau trong hệ sinh thái systemd, đây là cách tiêu chuẩn để đọc log của service do systemd quản lý.

Quy trình quản lý service hằng ngày

Một workflow đơn giản và rất thực tế là:

1. Xem trạng thái

sudo systemctl status myapp.service

2. Nếu cần, khởi chạy

sudo systemctl start myapp.service

3. Nếu muốn tự chạy khi boot

sudo systemctl enable myapp.service

4. Nếu sửa cấu hình

sudo systemctl restart myapp.service

5. Nếu lỗi, xem log

sudo journalctl -u myapp.service

Đây là bộ thao tác cốt lõi mà hầu như mọi service trên Raspberry Pi OS dùng systemd đều tuân theo.

Có thể biến app Python hoặc Node.js thành service không?

Có. Trên Raspberry Pi Forums, đây là câu hỏi rất phổ biến, và câu trả lời là có thể tạo systemd service cho Python program, Node.js app, hay các tiến trình nền khác. Điều quan trọng là bạn cần có một service unit file đúng, rồi dùng enable, start, status để quản lý nó.

Unit file là gì?

Unit file là file mô tả cho systemd biết service của bạn là gì, chạy lệnh nào, phụ thuộc vào thứ gì, chạy dưới user nào, có nên restart khi lỗi không, và có nên được kéo vào boot target nào không. Tài liệu systemd.servicesystemd.unit là nguồn chuẩn để hiểu các trường như [Unit], [Service], [Install].

Một ví dụ tối giản:

[Unit]
Description=My Python App

[Service]
ExecStart=/usr/bin/python3 /home/pi/app.py
Restart=always

[Install]
WantedBy=multi-user.target

Cấu trúc kiểu này cũng xuất hiện rất thường xuyên trong các ví dụ hỗ trợ trên Raspberry Pi Forums.

Sau khi sửa file service phải làm gì?

Nếu bạn vừa tạo mới hoặc chỉnh sửa unit file, thường phải nạp lại cấu hình systemd trước:

sudo systemctl daemon-reload

rồi mới:

sudo systemctl restart myapp.service

Đây là thực hành chuẩn với systemd khi metadata của unit đã thay đổi. Tài liệu systemctl mô tả các thao tác nạp lại trạng thái manager và quản lý unit sau khi cấu hình thay đổi.

Những lỗi thường gặp khi dùng systemctl

1. Nhầm giữa startenable

Rất nhiều người start xong tưởng service sẽ tự chạy sau khi reboot, nhưng thực ra cần enable nếu muốn tự khởi động cùng hệ thống. Raspberry Pi Forums lặp lại điều này rất nhiều lần.

2. Service chạy được bằng tay nhưng không chạy khi thành service

Điều này thường do môi trường khác nhau, đường dẫn không đầy đủ, user chạy khác, hoặc unit file thiếu các trường cần thiết như Type= hoặc WorkingDirectory=. Raspberry Pi Forums có nhiều ví dụ kiểu này và thường khuyên xem systemctl status trước.

3. Quên daemon-reload

Nếu vừa sửa unit file mà chưa daemon-reload, systemd có thể vẫn dùng cấu hình cũ. Đây là lỗi rất phổ biến khi mới tạo service riêng.

4. Không xem log

Chỉ nhìn “failed” mà không mở status hoặc journalctl sẽ làm bạn khó biết lỗi thật sự nằm ở đâu. Cả tài liệu systemd và thực hành trên Raspberry Pi đều ưu tiên chẩn đoán bằng status + log.

Khi nào nên dùng systemctl thay vì cách cũ như rc.local?

Với Raspberry Pi OS hiện đại dùng systemd, service manager chính là systemd, nên systemctl là cách chuẩn và bền hơn để quản lý app chạy nền. Các trao đổi trên Raspberry Pi Forums thường hướng người dùng mới sang systemd service thay vì các workaround cũ, vì service có log, status, restart policy, enable/disable rõ ràng hơn.

Checklist sau bài học

[ ] Biết xem trạng thái service bằng systemctl status
[ ] Biết start và stop service
[ ] Biết restart service sau khi sửa cấu hình
[ ] Biết enable để service tự chạy khi boot
[ ] Biết disable để ngừng tự khởi động
[ ] Biết xem log service khi có lỗi

Kết luận

systemctl là công cụ cốt lõi để quản lý service trên Raspberry Pi OS hiện đại. Chỉ cần nắm chắc vài lệnh như status, start, stop, restart, enable, disable, bạn đã có thể kiểm soát phần lớn các dịch vụ chạy nền trên Pi. Khi bắt đầu triển khai app riêng như Python script, Node.js backend hay gateway service, đây gần như là kỹ năng bắt buộc phải có.

Bài tiếp theo

Bài 15: Xem log và chẩn đoán lỗi với journalctl