Bạn có thể đã từng nghe đến thuật ngữ “daemon” khi làm việc với Linux. Vậy chúng là gì? Liệu chúng có đáng sợ không? Thực chất, những chương trình hỗ trợ nhỏ bé này là một phần quan trọng của Linux, giúp hệ thống vận hành trơn tru và thực hiện các dịch vụ thiết yếu.
Daemon là gì?
Trong Linux, daemon là các chương trình chạy độc lập trong nền để thực hiện nhiều tác vụ khác nhau trên hệ thống. Chúng bao gồm những việc như chạy cron
để thực thi các tác vụ theo lịch trình cụ thể, lắng nghe các kết nối mạng đến, và dọn dẹp hệ thống tập tin, cùng nhiều hoạt động khác. Các daemon thường có tên kết thúc bằng “-d”.
Khái niệm này xuất hiện vào những năm 1960 với dự án MULTICS, một nỗ lực đầy tham vọng nhằm tạo ra thứ mà ngày nay được gọi là “điện toán đám mây”. Nhà khoa học máy tính Fernando Corbató của MIT được ghi nhận là người đã đặt ra thuật ngữ này trong bối cảnh máy tính, lấy cảm hứng từ thí nghiệm tưởng tượng của nhà vật lý James Clark Maxwell về một con quỷ tưởng tượng sắp xếp các phân tử, được biết đến là “Quỷ Maxwell” (Maxwell’s Demon).
Corbató sau này đã viết về cảm hứng cho thuật ngữ này:
Quỷ Maxwell là một tác nhân tưởng tượng giúp sắp xếp các phân tử có tốc độ khác nhau và làm việc không ngừng nghỉ trong nền. Chúng tôi đã dùng từ daemon một cách hình tượng để mô tả các tiến trình nền làm việc không mệt mỏi để thực hiện các công việc hệ thống.
Trên các hệ điều hành đa nhiệm khác, những loại chương trình này thường được gọi là “dịch vụ” (services). Đó có lẽ là cách tốt nhất để hình dung về chúng.
Một ví dụ điển hình là crond
(phát âm là “cron-đê”), chương trình chạy các tác vụ được chỉ định trong các tệp crontab
. Trên các bản phân phối Linux hiện đại, nhiều tác vụ lẽ ra được xử lý bởi một daemon riêng biệt đang ngày càng nằm dưới sự quản lý của systemd
. Nếu bạn kiểm tra các daemon đang chạy, bạn sẽ thấy những thứ như systemd-networkd
, systemd-journald
, và systemd-timesyncd
.
Các hệ thống Linux hiện đại sẽ có rất nhiều daemon chạy trong nền, đặc biệt là trên các máy chủ. Ngay cả trên các hệ thống máy tính để bàn, cũng có thể có hàng chục, thậm chí hàng trăm daemon hoạt động ngầm. Đó là một trong những lý do bạn nên tắt hệ thống một cách an toàn thay vì chỉ nhấn nút nguồn khi có thể.
Xem các Daemon đang chạy
Bạn có thể xem những daemon nào đang chạy trên hệ thống của mình bằng một vài lệnh đơn giản.
Cách dễ nhất trên hầu hết các bản phân phối hiện đại là sử dụng lệnh systemctl
do systemd
cung cấp. Bạn có thể xem tất cả các dịch vụ (services) trên hệ thống chỉ bằng cách dùng systemctl
mà không có đối số nào. Một “unit” (đơn vị) là một tệp văn bản nhỏ cho systemd
biết cách tải một chương trình, cũng như các unit khác mà chương trình đó có thể yêu cầu, được gọi là “dependencies” (phụ thuộc), tương tự như trong quản lý gói.
systemctl list-units
Màn hình terminal hiển thị kết quả lệnh `systemctl list-units` trên Linux, liệt kê tất cả các đơn vị dịch vụ đang hoạt động.
Bạn cũng có thể xem các đơn vị systemd
thực sự là daemon bằng cách liệt kê các dịch vụ, là thuật ngữ mà systemd
đã áp dụng:
systemctl list-units --type=service
Kết quả từ lệnh `systemctl list-units –type=service` trong terminal Linux, hiển thị danh sách các dịch vụ hệ thống.
Lệnh này sẽ liệt kê tất cả các đơn vị dịch vụ đã cài đặt trên hệ thống của bạn. Để xem những đơn vị nào thực sự đang chạy, bạn có thể sử dụng lệnh này:
systemctl list-units --type=service state=active
Danh sách các dịch vụ đang chạy (active) trên hệ thống Linux được hiển thị thông qua lệnh `systemctl list-units –type=service state=active`.
Lệnh này sẽ cung cấp cho bạn danh sách các dịch vụ đang hoạt động. Trên máy ảo Debian này, chúng ta có một số dịch vụ đang hoạt động, bao gồm Avahi, cho phép hệ thống tự động kết nối với các thiết bị khác như máy in trên mạng cục bộ, và NetworkManager, xử lý kết nối mạng. Bạn có thể thấy chúng được trình bày gọn gàng trong một bảng. Phần “description” (mô tả) cho bạn biết các dịch vụ này thực sự làm gì.
Cách cổ điển khác để xem các daemon đang chạy là sử dụng lệnh ps
. Chúng ta có thể sử dụng tùy chọn “aux” để xem tất cả các tiến trình trên hệ thống, bất kể chúng thuộc về ai, vì hầu hết các tiến trình thuộc về siêu người dùng (superuser), và bạn có thể không phải là siêu người dùng. Nếu bạn là root, bạn nên thay đổi điều đó nhanh chóng bằng cách thiết lập tài khoản người dùng của riêng mình.
Để xem tất cả các tiến trình trên hệ thống với ps
:
ps aux
Màn hình terminal hiển thị danh sách tất cả các tiến trình đang chạy trên Linux, bao gồm cả daemon, thông qua lệnh `ps aux`.
Bạn sẽ không có nhiều thông tin về những tiến trình nào là daemon, nhưng một manh mối tốt là nếu tên của chúng kết thúc bằng “-d” như đã đề cập trước đó. Trường “TTY” cũng sẽ thường có dấu “?” (dấu hỏi), cho biết rằng chúng được khởi động mà không có thiết bị đầu cuối điều khiển.
Giao diện `htop` trong terminal Linux hiển thị chi tiết các tiến trình đang chạy, bao gồm cả daemon, với thông tin màu sắc dễ đọc.
Bạn cũng có thể xem tất cả các tiến trình đang chạy, bao gồm cả daemon, với top
hoặc htop
, công cụ cung cấp giao diện hiển thị màu sắc dễ nhìn hơn.
Bật và Tắt Daemon
Bạn có thể bật và tắt daemon tùy ý. Linux theo truyền thống là một hệ thống dành cho các chuyên gia, và đặt ít rào cản trên con đường bạn quản lý hệ thống theo cách bạn muốn.
Cách phổ biến nhất để thêm một daemon mới vào hệ thống là cài đặt nó từ trình quản lý gói của bạn. Ví dụ, nếu bạn muốn cài đặt máy chủ web NGINX trên hệ thống Debian hoặc Ubuntu, giả sử bạn có đặc quyền quản trị:
sudo apt install nginx
Những gì xảy ra sau đó tùy thuộc vào bản phân phối bạn đang sử dụng. Một số bản phân phối, như Debian và Ubuntu, sẽ tự động kích hoạt một dịch vụ khi khởi động. Những bản khác, như Arch, thường sẽ để việc đó cho bạn. Việc này rất dễ thực hiện với systemctl
.
Để kích hoạt một daemon:
sudo systemctl enable daemon.service
Ví dụ, để kích hoạt NGINX:
sudo systemctl enable nginx.service
Kích hoạt dịch vụ NGINX khởi động cùng hệ thống bằng lệnh `sudo systemctl enable nginx.service` trong terminal Linux.
Việc vô hiệu hóa daemon bằng systemctl
cũng tương tự:
sudo systemctl disable nginx.service
Hãy đảm bảo bạn hiểu rõ chức năng của một daemon trước khi vô hiệu hóa nó, đặc biệt là những daemon được cài đặt sẵn cùng hệ thống. Nếu không chắc chắn, hãy giữ nguyên trạng thái của chúng.
Khởi động và Dừng Daemon
Bạn không cần phải đợi khởi động lại để thay đổi các daemon đang chạy. Bạn có thể khởi động và dừng daemon tùy ý miễn là bạn có quyền quản trị. Trên hầu hết các hệ thống Linux, điều này có nghĩa là bạn có quyền truy cập thông qua mật khẩu root hoặc sudo
. Chúng ta sẽ sử dụng cách sau.
Bạn có thể muốn khởi động một daemon khi bạn đã cài đặt nó. Tùy thuộc vào bản phân phối, nó có thể được khởi động tự động khi bạn cài đặt một daemon từ trình quản lý gói của bản phân phối đó. Debian và Ubuntu là những ví dụ điển hình. Trên các bản phân phối khác, bạn có thể phải tự chịu trách nhiệm khởi động nó. Arch Linux là một ví dụ điển hình của trường hợp sau.
Hoặc bạn có thể muốn khởi động lại một daemon sau khi đã dừng nó trước đó.
Giả sử bạn muốn khởi động máy chủ web NGINX. Để làm điều đó bằng systemctl
:
sudo systemctl start nginx.service
Bạn cũng có thể dừng các dịch vụ đang chạy. Một lần nữa, bạn có thể sử dụng systemctl
để dừng tiến trình:
sudo systemctl stop nginx.service
Việc khởi động và dừng các tiến trình theo cách này sẽ chỉ ảnh hưởng đến lần khởi động hiện tại. Để thực hiện các thay đổi vĩnh viễn hơn, bạn sẽ phải bật hoặc tắt các dịch vụ bằng các phương pháp được đề cập trong phần “Bật và Tắt Daemon”.
Thông thường, bạn sẽ muốn khởi động lại một daemon. Bạn có thể đã cập nhật phiên bản của daemon đang chạy, hoặc đã thay đổi cấu hình của nó. Một cách để làm điều này là dừng và sau đó khởi động lại daemon:
sudo systemctl stop daemon.service
sudo systemctl start daemon.service
Bạn có thể thực hiện điều này chỉ bằng một lệnh duy nhất và tiết kiệm một chút thao tác gõ phím với lệnh systemctl restart
. Giả sử bạn đã thực hiện các thay đổi đối với máy chủ NGINX của mình và muốn kiểm tra chúng. Bạn có thể sử dụng lệnh này:
sudo systemctl restart nginx.service
Thật dễ dàng trên một hệ thống Linux hiện đại. Ngay cả với những phàn nàn về sự “cồng kềnh” được cho là của systemd
, nó đã giúp việc khởi động và dừng các tiến trình trở nên dễ dàng hơn mà không cần phải tìm kiếm thông qua các liên kết tượng trưng như tôi đã phải làm với hệ thống SysVInit
cũ. Tôi cho rằng rất nhiều nhà phát triển và quản trị viên hệ thống khác cũng cảm thấy như vậy, xét về tốc độ systemd
được chấp nhận trong hệ sinh thái Linux.
Daemon có vẻ đáng sợ nếu bạn chưa quen với chúng, nhưng chỉ cần một vài lệnh là bạn có thể “thuần hóa” chúng trên hệ thống Linux của mình. Bạn có thể không để ý đến chúng, nhưng chúng luôn hiện diện trên hệ thống Linux của bạn, giúp cuộc sống của bạn dễ dàng hơn.