Linux disown command

Lệnh Linux Disown: Giải Phóng Tiến Trình Khỏi Xiềng Xích Của Terminal

Bạn đã bao giờ gặp phải tình huống đang chạy một chương trình quan trọng trên terminal Linux, nhưng lại muốn đóng terminal đó đi mà không muốn chương trình bị tắt? Lệnh disown chính là vị cứu tinh của bạn trong trường hợp này. Nó cho phép bạn tách một tiến trình đang chạy khỏi terminal, giúp tiến trình tiếp tục chạy ngay cả khi bạn đóng cửa sổ terminal.

Bài viết này sẽ đi sâu vào lệnh disown, khám phá cách thức hoạt động, các tùy chọn hữu ích, và những tình huống thực tế mà bạn có thể áp dụng nó. Chúng ta cũng sẽ so sánh disown với các phương pháp khác để giữ tiến trình chạy nền, giúp bạn lựa chọn giải pháp phù hợp nhất với nhu cầu của mình.

Disown Là Gì?

Về cơ bản, disown loại bỏ một tiến trình khỏi danh sách job control của shell hiện tại. Khi một tiến trình được tạo ra từ terminal, nó sẽ được liên kết với terminal đó. Khi bạn đóng terminal, một tín hiệu (SIGHUP) sẽ được gửi đến tất cả các tiến trình liên kết, thường dẫn đến việc chúng bị tắt. disown ngăn chặn điều này bằng cách loại bỏ liên kết đó, giúp tiến trình tiếp tục chạy ngay cả khi terminal đóng.

Hãy tưởng tượng bạn đang tải xuống một file lớn bằng wget. Bạn không muốn giữ terminal mở cho đến khi quá trình tải xuống hoàn tất. Sử dụng disown, bạn có thể tách wget khỏi terminal và đóng cửa sổ mà không lo việc tải xuống bị gián đoạn.

Cú Pháp Lệnh Disown

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

disown [-h] [-ar] [jobspec ...]

Trong đó:

  • -h: Đánh dấu mỗi jobspec để không có tín hiệu SIGHUP nào được gửi đến job đó nếu shell nhận được tín hiệu SIGHUP.
  • -a: Áp dụng cho tất cả các job đang chạy.
  • -r: Áp dụng cho tất cả các job đang chạy (running jobs).
  • jobspec: Chỉ định job bạn muốn disown. Nếu không có jobspec nào được cung cấp, job hiện tại sẽ được sử dụng.

Cách Sử Dụng Lệnh Disown

Để sử dụng disown, bạn cần xác định jobspec của tiến trình bạn muốn tách. Bạn có thể tìm thấy jobspec bằng lệnh jobs.

  1. Khởi chạy tiến trình ở chế độ nền: Sử dụng & sau lệnh để chạy tiến trình ở chế độ nền. Ví dụ: sleep 60 & (chạy lệnh sleep trong 60 giây ở chế độ nền).
  2. Kiểm tra danh sách job: Sử dụng lệnh jobs để xem danh sách các job đang chạy nền. Bạn sẽ thấy một danh sách các job với số job tương ứng.
  3. Sử dụng disown để tách tiến trình: Sử dụng lệnh disown kèm theo jobspec (số job) để tách tiến trình khỏi terminal. Ví dụ: disown %1 (tách job số 1). Nếu bạn muốn disown job hiện tại, chỉ cần gõ disown.

Ví dụ:


    sleep 60 &
    jobs
    [1] 12345
    disown %1
    jobs
    # Không có job nào được hiển thị
  

Trong ví dụ trên, sleep 60 được chạy ở chế độ nền. Lệnh jobs hiển thị job số 1 với PID là 12345. Sau khi chạy disown %1, job số 1 bị loại khỏi danh sách job, và sleep 60 vẫn tiếp tục chạy ngay cả khi bạn đóng terminal.

Các Tùy Chọn Nâng Cao của Disown

  • disown -h: Ngăn chặn việc gửi tín hiệu SIGHUP đến tiến trình khi terminal đóng. Đây là tùy chọn hữu ích nếu bạn muốn đảm bảo rằng tiến trình sẽ không bị ảnh hưởng khi terminal đóng.
  • disown -a: Áp dụng cho tất cả các job đang chạy. Điều này rất hữu ích nếu bạn có nhiều job chạy nền và muốn tách tất cả chúng khỏi terminal.
  • disown -r: Áp dụng cho tất cả các job đang chạy. Tương tự như -a, nhưng chỉ áp dụng cho các job đang ở trạng thái "running".

So Sánh Disown với Nohup và Screen/Tmux

Ngoài disown, còn có các công cụ khác như nohup và screen/tmux có thể giúp bạn giữ tiến trình chạy nền. Dưới đây là bảng so sánh để giúp bạn hiểu rõ hơn về sự khác biệt giữa chúng:

Tính năng Disown Nohup Screen/Tmux
Mục đích chính Tách tiến trình khỏi terminal hiện tại Chạy tiến trình bỏ qua tín hiệu HUP Quản lý nhiều phiên terminal trong một cửa sổ
Yêu cầu khởi chạy ban đầu Tiến trình phải đang chạy nền Cần được sử dụng khi khởi chạy tiến trình Cần tạo một phiên mới
Khả năng kết nối lại Không Không
Ghi log Không (trừ khi tiến trình tự ghi) Có (mặc định vào nohup.out) Có thể cấu hình
Phù hợp với Tiến trình đã chạy và muốn tách khỏi terminal Chạy các lệnh đơn giản mà không cần tương tác Quản lý nhiều phiên làm việc, cần kết nối lại sau

Nohup chủ yếu được sử dụng để chạy các lệnh mà bạn biết sẽ mất nhiều thời gian. Nó tự động ghi log vào file nohup.out và bảo vệ tiến trình khỏi tín hiệu HUP. Tuy nhiên, bạn cần phải sử dụng nohup khi khởi chạy tiến trình. Bạn không thể dùng nohup để "disown" một tiến trình đã chạy rồi.

ScreenTmux là các trình quản lý phiên terminal mạnh mẽ. Chúng cho phép bạn tạo nhiều phiên terminal trong một cửa sổ, và bạn có thể dễ dàng kết nối lại với các phiên này sau khi đóng terminal. Đây là lựa chọn tốt nhất nếu bạn cần tương tác với tiến trình thường xuyên hoặc muốn giữ nhiều phiên làm việc khác nhau.

Các Tình Huống Sử Dụng Thực Tế

  • Tải xuống file lớn: Sử dụng disown để tách tiến trình tải xuống file lớn bằng wget hoặc curl khỏi terminal.
  • Chạy script dài hạn: Nếu bạn có một script chạy trong thời gian dài, hãy sử dụng disown để đảm bảo rằng script vẫn tiếp tục chạy ngay cả khi bạn đóng terminal.
  • Khởi chạy server: Bạn có thể sử dụng disown để tách một server (ví dụ: một web server đơn giản) khỏi terminal.
  • Chạy các tác vụ cron-like: Mặc dù cron là lựa chọn tốt hơn cho các tác vụ lặp đi lặp lại theo lịch, bạn có thể sử dụng disown cho các tác vụ một lần cần chạy nền.

Ví Dụ Cụ Thể

Giả sử bạn muốn chạy một script có tên my_script.sh ở chế độ nền và tách nó khỏi terminal:


    ./my_script.sh &
    jobs
    [1] 12345
    disown %1
  

Bây giờ bạn có thể đóng terminal, và my_script.sh vẫn tiếp tục chạy.

Câu Hỏi Thường Gặp (FAQ)

  • Làm thế nào để biết một tiến trình đã được disown? Sau khi disown, tiến trình sẽ không còn hiển thị trong danh sách job (jobs). Bạn có thể kiểm tra bằng lệnh ps để xem tiến trình có còn chạy hay không.
  • Disown có đảm bảo tiến trình sẽ không bao giờ bị tắt? Không. Tiến trình vẫn có thể bị tắt do các yếu tố khác (ví dụ: hệ thống bị tắt, lỗi trong chương trình). disown chỉ đơn giản là loại bỏ liên kết với terminal, ngăn chặn việc gửi tín hiệu HUP khi terminal đóng.
  • Tôi có thể re-attach một tiến trình đã được disown không? Không. disown là một thao tác một chiều. Nếu bạn cần khả năng kết nối lại, hãy sử dụng screen hoặc tmux.

Kết Luận

Lệnh disown là một công cụ hữu ích trong Linux để tách các tiến trình đang chạy khỏi terminal. Nó đơn giản, dễ sử dụng, và có thể giúp bạn tiết kiệm thời gian và công sức. Tuy nhiên, hãy nhớ rằng disown không phải là giải pháp cho mọi trường hợp. Hãy cân nhắc các lựa chọn khác như nohup và screen/tmux để chọn công cụ phù hợp nhất với nhu cầu của bạn.

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 về lệnh disown và cách sử dụng nó hiệu quả. Chúc bạn thành công!

Last Updated : 22/08/2025