Lệnh disown trong linux

Lệnh disown trong Linux: Giải phóng tiến trình khỏi sự ràng buộc của Terminal

Bạn đã bao giờ gặp phải tình huống muốn chạy một chương trình trên Linux, nhưng lại không muốn nó bị dừng khi bạn đóng cửa sổ terminal? Lệnh disown chính là giải pháp bạn cần! Bài viết này sẽ giúp bạn hiểu rõ về disown, cách nó hoạt động, và những ứng dụng thực tế của nó.

Hãy tưởng tượng bạn đang tải xuống một tập tin lớn bằng wget, hoặc đang chạy một script phức tạp mất nhiều thời gian. Bạn không muốn phải giữ cửa sổ terminal mở cho đến khi quá trình hoàn tất. Đó là lúc disown phát huy tác dụng.

disown là gì?

Về cơ bản, disown là một lệnh shell trong Linux cho phép bạn gỡ bỏ một tiến trình đang chạy khỏi danh sách các tiến trình mà terminal đang quản lý. Điều này có nghĩa là khi bạn đóng terminal, tiến trình đó sẽ tiếp tục chạy mà không bị ảnh hưởng.

Khi bạn khởi chạy một chương trình từ terminal, shell (ví dụ: Bash, Zsh) sẽ coi nó như một tiến trình con. Nếu bạn đóng terminal, shell sẽ gửi tín hiệu HUP (hangup) đến tất cả các tiến trình con, thường khiến chúng dừng lại. disown ngăn chặn điều này bằng cách loại bỏ tiến trình khỏi danh sách quản lý của shell, do đó nó sẽ không nhận được tín hiệu HUP khi bạn đóng terminal.

Cú pháp lệnh disown

Cú pháp của lệnh disown khá đơn giản:

disown [options] [jobspec...]

Trong đó:

  • options: Các tùy chọn để thay đổi hành vi của lệnh (ví dụ: -h, -r, -a).
  • jobspec: Chỉ định tiến trình nào bạn muốn disown. Nếu không chỉ định, mặc định là tiến trình đang chạy gần đây nhất. Jobspec có thể là ID công việc (job ID) hoặc PID (process ID).

Các tùy chọn thường dùng của lệnh disown

  • -h: Đánh dấu mỗi jobspec được chỉ định để không nhận được tín hiệu SIGHUP nếu shell nhận được tín hiệu SIGHUP.
  • -a: Loại bỏ tất cả các job đang chạy hoặc bị dừng.
  • -r: Loại bỏ tất cả các job đang chạy.
  • -s: Loại bỏ jobspec khỏi bảng job, nếu không còn job nào khác.

Cách sử dụng lệnh disown trong thực tế

Để hiểu rõ hơn về cách disown hoạt động, hãy xem một vài ví dụ:

Ví dụ 1: Chạy một lệnh và disown nó ngay lập tức

Giả sử bạn muốn chạy lệnh sleep 600 (nghĩa là chờ 600 giây) và disown nó để nó tiếp tục chạy ngay cả khi bạn đóng terminal:

sleep 600 & disown

Dấu & ở cuối lệnh giúp chạy lệnh ở chế độ nền (background). Sau đó, disown sẽ loại bỏ nó khỏi sự quản lý của terminal.

Ví dụ 2: Disown một tiến trình đang chạy bằng Job ID

Bạn có thể xem danh sách các tiến trình đang chạy ở chế độ nền bằng lệnh jobs:

jobs

Kết quả có thể hiển thị như sau:

[1]+  Running                 sleep 600 &

Số 1 trong dấu ngoặc vuông là Job ID. Để disown tiến trình này, bạn sử dụng lệnh:

disown %1

Ví dụ 3: Disown một tiến trình đang chạy bằng Process ID (PID)

Bạn có thể tìm PID của một tiến trình bằng lệnh ps hoặc top. Ví dụ:

ps aux | grep sleep

Giả sử PID của tiến trình sleep 600 là 1234. Để disown tiến trình này, bạn sử dụng lệnh:

disown 1234

Lưu ý quan trọng: Khi bạn sử dụng PID, disown chỉ hoạt động nếu tiến trình đó là một tiến trình con của shell hiện tại. Nếu không, bạn sẽ nhận được thông báo lỗi.

Sự khác biệt giữa nohup và disown

Cả nohupdisown đều được sử dụng để chạy các tiến trình ngay cả sau khi bạn đóng terminal, nhưng chúng hoạt động khác nhau. Dưới đây là bảng so sánh:

Tính năng nohup disown
Mục đích chính Ngăn chặn tín hiệu HUP khi đóng terminal. Loại bỏ tiến trình khỏi danh sách quản lý của shell.
Cách sử dụng Chạy lệnh trực tiếp với nohup command &. Chạy lệnh, sau đó sử dụng disown.
Chuyển hướng output Tự động chuyển hướng stdout và stderr vào file nohup.out. Không tự động chuyển hướng output. Bạn cần tự làm điều này bằng cách sử dụng các toán tử chuyển hướng (ví dụ: >, >>).
Ảnh hưởng đến tiến trình Khởi chạy một tiến trình mới. Thay đổi trạng thái của một tiến trình đang chạy.
Tính di động Phổ biến trên hầu hết các hệ thống Unix-like. Có thể không có sẵn trên một số hệ thống cũ.

Nói tóm lại:

  • Sử dụng nohup khi bạn muốn chạy một lệnh từ đầu và đảm bảo nó không bị dừng khi bạn đóng terminal, đồng thời không cần quan tâm đến việc quản lý output.
  • Sử dụng disown khi bạn đã chạy một lệnh và muốn loại bỏ nó khỏi sự quản lý của shell để nó tiếp tục chạy sau khi bạn đóng terminal, và bạn muốn kiểm soát output của nó.

Các tình huống thực tế sử dụng lệnh disown

Dưới đây là một vài tình huống thực tế mà bạn có thể sử dụng lệnh disown:

  • Tải xuống tập tin lớn: Sử dụng wget hoặc curl để tải xuống một tập tin lớn, sau đó disown tiến trình để nó tiếp tục tải xuống ngay cả khi bạn đóng terminal.
  • Chạy script dài hạn: Chạy một script phức tạp mất nhiều thời gian, chẳng hạn như một script xử lý dữ liệu hoặc một script sao lưu, và disown nó để nó hoàn thành công việc mà không cần bạn phải giữ terminal mở.
  • Khởi chạy ứng dụng GUI từ terminal: Khởi chạy một ứng dụng GUI (ví dụ: Firefox, Chrome) từ terminal và disown nó để bạn có thể đóng terminal mà không làm đóng ứng dụng.
  • Quản lý các tiến trình server: Chạy các tiến trình server (ví dụ: một web server, một database server) từ terminal và disown chúng để chúng tiếp tục chạy ngay cả khi bạn đăng xuất khỏi hệ thống.

Lưu ý quan trọng khi sử dụng lệnh disown

  • Kiểm tra trạng thái tiến trình: Sau khi disown một tiến trình, bạn nên kiểm tra trạng thái của nó bằng lệnh ps hoặc top để đảm bảo nó vẫn đang chạy như mong đợi.
  • Quản lý output: Nếu tiến trình bạn disown tạo ra output, hãy đảm bảo bạn đã chuyển hướng output vào một file để tránh làm lộn xộn terminal.
  • Cẩn thận với các tiến trình quan trọng: Hãy cẩn thận khi disown các tiến trình quan trọng, vì bạn có thể gặp khó khăn trong việc quản lý hoặc dừng chúng sau này.

FAQ về lệnh disown

Câu hỏi 1: Làm thế nào để dừng một tiến trình đã disown?

Trả lời: Bạn cần tìm PID của tiến trình đó (sử dụng ps hoặc top) và sau đó sử dụng lệnh kill để gửi tín hiệu dừng đến tiến trình. Ví dụ:

kill 1234

Trong đó 1234 là PID của tiến trình bạn muốn dừng.

Câu hỏi 2: Có thể disown nhiều tiến trình cùng một lúc không?

Trả lời: Có, bạn có thể disown nhiều tiến trình cùng một lúc bằng cách chỉ định nhiều jobspec hoặc sử dụng tùy chọn -a hoặc -r.

Câu hỏi 3: Lệnh disown có hoạt động trên tất cả các hệ thống Linux không?

Trả lời: Lệnh disown là một phần của Bash shell, vì vậy nó có sẵn trên hầu hết các hệ thống Linux. Tuy nhiên, nó có thể không có sẵn trên một số hệ thống cũ hoặc các hệ thống sử dụng shell khác (ví dụ: csh, tcsh).

Kết luận

Lệnh disown là một công cụ mạnh mẽ giúp bạn quản lý các tiến trình trong Linux một cách hiệu quả. Bằng cách loại bỏ một tiến trình khỏi sự quản lý của terminal, bạn có thể đảm bảo nó tiếp tục chạy ngay cả khi bạn đóng terminal. Hy vọng bài viết này đã cung cấp cho bạn những kiến thức cần thiết để sử dụng lệnh disown một cách tự tin và hiệu quả.

Last Updated : 21/08/2025