Hệ điều hành Linux, được thừa hưởng triết lý thiết kế mạnh mẽ từ Unix, nổi tiếng với khả năng đa nhiệm và linh hoạt. Các chương trình trong Linux thường giao tiếp qua văn bản, có thể kết hợp qua các đường ống (pipelines), và mỗi chương trình thường chỉ làm tốt một việc. Tuy nhiên, đằng sau sự đơn giản đó là một thế giới đa dạng của các loại chương trình với những hành vi và mục đích khác nhau. Việc nắm vững các loại chương trình và tiến trình này là chìa khóa để khai thác tối đa sức mạnh của Linux, từ quản lý hệ thống đến phát triển phần mềm. Bài viết này sẽ phân loại và giải thích chi tiết các dạng chương trình phổ biến nhất trong môi trường Linux, giúp bạn đọc có cái nhìn toàn diện hơn về cách chúng hoạt động.
Tiến Trình Nền (Background Processes)
Hệ điều hành đa nhiệm như Linux chạy rất nhiều chương trình cùng lúc. Những chương trình chạy mà không có sự kiểm soát trực tiếp từ người dùng được gọi là tiến trình nền. Về cơ bản, có một loại tiến trình nền chính, thường được biết đến với cái tên “daemon.”
1. Daemon
Thuật ngữ “daemon” nghe có vẻ lạ, nhưng nó chỉ đơn giản là “tiến trình nền.” Một daemon thường sử dụng các kỹ thuật đặc biệt để giữ cho nó luôn chạy, bất kể điều gì xảy ra trên hệ thống. Ví dụ, nó sẽ “fork” một bản sao của chính nó để chạy độc lập với shell. Các dịch vụ như inetd
hoặc launchd
có thể thực hiện điều này thay mặt cho một chương trình, và bản thân chúng cũng là các daemon.
Các daemon thường có tên kết thúc bằng “d”, ví dụ như httpd
(máy chủ web Apache), inetd
(internet service daemon), và systemd
.
Nếu một chương trình bên ngoài — hoặc người dùng — cần giao tiếp với một daemon, nó thường thực hiện điều đó bằng cách gửi một tín hiệu để hướng dẫn daemon khởi động lại hoặc tải lại cấu hình của nó. Bạn có thể sử dụng công cụ ps
để khám phá những daemon nào đang chạy trên hệ thống của bạn.
Giao Diện Dòng Lệnh (Command Line Interface – CLI)
Hầu hết các chương trình Linux đều có giao diện dòng lệnh, nghĩa là bạn sử dụng chúng bằng cách gõ các lệnh văn bản. Đây là những chương trình terminal phổ biến nhất và thường dễ sử dụng nhất. Những chương trình này thường khởi động, chạy nhanh rồi dừng lại ngay sau khi hoàn thành công việc.
2. Cantrip
Loại chương trình đơn giản nhất — được gọi không chính thức là “cantrip” — sẽ chỉ hoạt động mà không cần đầu vào hay tạo ra đầu ra nào. Những chương trình này thường hoạt động trên các tệp hoặc thực hiện các tác vụ quản trị hệ thống liên quan. Chương trình rm
, dùng để xóa tệp, là một ví dụ điển hình:
rm myfile.txt
Nếu tệp tồn tại, rm
sẽ xóa nó và terminal của bạn sẽ hiển thị dấu nhắc lệnh ở dòng tiếp theo, chờ chương trình hoặc lệnh tiếp theo:
Mô tả kết quả thực thi lệnh rm trong Linux, không có đầu ra hiển thị trên terminal.
Lệnh rm
có một số tùy chọn để kiểm soát cách nó chạy, nhưng sự đơn giản của nó nằm ở việc thiếu đầu vào và đầu ra.
3. Bộ Lọc (Filter)
Nhiều chương trình Linux hoàn toàn ngược lại: chúng yêu cầu đầu vào và tạo ra đầu ra. Thường thì những chương trình này sửa đổi đầu vào của chúng theo một cách nào đó, và có rất nhiều chương trình như vậy: cut
, head
, sort
, uniq
, v.v.
Lệnh grep
minh họa ý nghĩa của “bộ lọc” đặc biệt rõ ràng: nó quét từng dòng đầu vào, tái tạo nó thành đầu ra nếu nó thỏa mãn một điều kiện nhất định. Trong trường hợp của grep
, điều kiện là một biểu thức chính quy (regular expression) khớp với một mẫu văn bản nhất định:
cat /etc/passwd | grep root
Các bộ lọc xuất sắc trong việc thao tác dữ liệu và thường được sử dụng trong các đường ống (pipelines) để nối chuỗi nhiều lệnh lại với nhau nhằm thực hiện một tác vụ phức tạp. Bạn thậm chí có thể kết hợp các công cụ này để xây dựng một cơ sở dữ liệu sơ khai.
4. Điểm Dừng (Sink)
Trái ngược với các bộ lọc, có rất ít chương trình dạng “sink” (điểm dừng). Loại chương trình này nhận đầu vào nhưng không tạo ra đầu ra — ít nhất là không phải đầu ra trên màn hình terminal của bạn. Một ví dụ là lpr
, trình in dòng, dùng để in một tệp hoặc đầu vào tiêu chuẩn ra giấy.
Các chương trình “sink” thường xuất ra các phương tiện khác ngoài màn hình, chẳng hạn như chương trình espeak
chuyển đổi văn bản thành giọng nói.
5. Nguồn (Source)
Đối lập với “sink” là “source” (nguồn), một chương trình tạo ra đầu ra mà không xử lý bất kỳ đầu vào nào. Các chương trình “source” lấy dữ liệu từ nơi khác: môi trường hoặc một tệp được chỉ định làm đối số, chẳng hạn.
Chương trình ls
sử dụng nhiều cách tiếp cận khác nhau để liệt kê các tệp, nhưng nó không bao giờ xử lý đầu vào tiêu chuẩn. Trong trường hợp đơn giản nhất, ls
thậm chí không cần bất kỳ đối số nào:
ls
Theo mặc định, ls
hoạt động trên thư mục hiện tại, in ra nội dung của nó. Bạn có thể hiển thị chi tiết của một thư mục, tệp hoặc tập hợp các tệp khác bằng cách truyền các đối số dòng lệnh:
ls /tmp
ls /etc/passwd
ls ~/.*
6. Trình Biên Dịch (Compiler)
Một trình biên dịch là loại chương trình CLI phức tạp nhất, thường dành cho việc lập trình. Một trình biên dịch sẽ chạy như bất kỳ chương trình nào khác, nhưng có thể mất nhiều thời gian hơn để hoàn thành vì công việc của nó khá phức tạp.
Tên của chúng thường kết thúc bằng “c” cho “compiler:” cc
, javac
, hoặc rustc
. Một trình biên dịch giống như một cantrip, nhưng nó luôn làm việc với các tệp, chuyển đổi một loại dữ liệu sang loại khác.
Trình biên dịch C, cc
, minh họa hành vi điển hình của một trình biên dịch:
cc file1.c file2.c -o program
Lệnh này chạy trình biên dịch đối với hai tệp — file1.c
và file2.c
— tạo ra một tệp thứ ba có tên program
. Ở đây, đối số “-o” là viết tắt của “output file” (tệp đầu ra).
Điều quan trọng cần lưu ý là một trình biên dịch có thể lấy thêm các tệp bổ sung làm nguồn, tùy thuộc vào tác vụ của nó hoặc ngôn ngữ cơ bản. Một chương trình C như file1.c
có thể bao gồm một tệp tiêu đề (ví dụ: file1.h
) mà trình biên dịch sẽ định vị và sử dụng để tạo chương trình cuối cùng, ngay cả khi nó không được đặt tên rõ ràng khi bạn chạy lệnh.
Đây là một phần khiến các trình biên dịch trở nên phức tạp: chúng có thể làm nhiều việc “đằng sau hậu trường” mà không cần phải được hướng dẫn trực tiếp.
Chương Trình Tương Tác (Interactive Programs)
Các chương trình trước đó đều chạy không tương tác. Khi bạn chạy chúng, bạn không có quyền kiểm soát trực tiếp cách chúng hoạt động. Hai loại chương trình cuối cùng này thì rất khác.
7. Tương Tác Từng Dòng (Line-by-line)
Dạng tương tác đơn giản nhất là từng dòng một. Vào buổi đầu lịch sử Unix, những lệnh này khá phổ biến vì chúng chạy trên máy teletype: những chiếc máy đánh chữ được nâng cấp hoạt động từng dòng một.
Ngày nay, những chương trình này thực sự mang lại cảm giác “tương tác chỉ trên danh nghĩa,” nhưng vào những năm 1960, chúng khá mang tính cách mạng. Nếu bạn đủ dũng cảm, bạn có thể sống lại những ngày xưa cũ với trình soạn thảo văn bản gốc, ed
:
Giao diện terminal minh họa cách sử dụng trình soạn thảo văn bản ed trong Linux để tạo và lưu file.
Bản ghi ed
này cho thấy các lệnh viết văn bản “hello world” vào một tệp có tên foo.txt
. Một số dòng đó được người dùng gõ: “a” là lệnh để thêm văn bản vào bộ đệm, “,p” in bộ đệm hiện tại, và “w” ghi bộ đệm vào một tệp. Sau khi ghi, ed
báo cáo số byte đã ghi, trong trường hợp này là 13.
Nếu bạn nhớ một điều về ed
, đó nên là lệnh “q” để thoát khỏi chương trình. Nó sẽ không lưu bất kỳ văn bản mới nào bạn đã nhập, nhưng nếu bạn vô tình chạy ed
, gõ “q” theo sau bởi Enter sẽ cho phép bạn rời khỏi nó nhanh nhất có thể!
Như bạn có thể thấy, chỉnh sửa văn bản từng dòng là một quá trình gian khổ và dễ mắc lỗi. Chương trình ed
có thể hữu ích trong trường hợp khẩn cấp, nhưng các chương trình tương tác từng dòng nhìn chung đã lỗi thời.
8. Giao Diện Người Dùng Văn Bản (Text-User Interface – TUI)
Một lựa chọn tốt hơn nhiều cho các chương trình tương tác, đặc biệt là trình soạn thảo văn bản, là kiểu TUI: giao diện người dùng văn bản. Tên này phân biệt các chương trình này với ứng dụng GUI, vốn sử dụng đồ họa để đạt được cùng loại kết quả: một chương trình thực sự tương tác.
Trình soạn thảo văn bản vim
vẫn dựa nhiều vào lệnh, nhưng bạn có thể sử dụng nó để di chuyển trong một tệp văn bản, tìm kiếm văn bản, xóa toàn bộ các khối và thấy mọi thứ diễn ra trên màn hình, theo thời gian thực. Các TUI hiện đại sử dụng rộng rãi màu sắc và các ký tự vẽ hộp để mô phỏng một giao diện đồ họa:
Giao diện người dùng văn bản (TUI) của ứng dụng Bagels, hiển thị nhiều tính năng qua các bảng điều khiển.
Mặc dù bạn sẽ không phải lúc nào cũng thấy các tham chiếu đến những loại chương trình này, nhưng việc biết chúng tồn tại và hiểu chúng làm gì là rất hữu ích. Mỗi loại đều có những điểm mạnh riêng và có thể được sử dụng trong những ngữ cảnh nhất định để hoàn thành nhiều tác vụ khác nhau.
Kết Luận
Từ những tiến trình nền lặng lẽ như Daemon, các công cụ dòng lệnh mạnh mẽ như Filter và Compiler, cho đến các giao diện tương tác hiện đại như TUI, thế giới chương trình Linux vô cùng phong phú và đa dạng. Việc hiểu rõ từng loại chương trình này không chỉ giúp bạn sử dụng hệ điều hành Linux một cách hiệu quả hơn mà còn mở ra cánh cửa để bạn khám phá sâu hơn về kiến trúc và triết lý đằng sau nó. Xalocongnghe.com hy vọng bài viết này đã cung cấp cho bạn những kiến thức nền tảng vững chắc để tiếp tục hành trình làm chủ Linux. Hãy tiếp tục khám phá và đừng ngần ngại chia sẻ những ý kiến hoặc câu hỏi của bạn về chủ đề này!