Làm thế nào để ngăn một lệnh dừng lại khi đóng cửa sổ terminal trong Linux?

Cập nhật lần cuối: 17/12/2025
tác giả: Isaac
  • Việc sử dụng nohup và chạy ngầm cho phép các tiến trình vẫn hoạt động ngay cả sau khi bạn đóng chương trình. thiết bị đầu cuối hoặc phiên họp SSH.
  • Việc điều khiển tiến trình bằng các phím &, Ctrl+Z, bg, fg và lệnh nội bộ disown sẽ hủy liên kết các tiến trình đã được khởi chạy từ bảng điều khiển.
  • Các công cụ như screen hoặc tmux tạo ra các phiên terminal liên tục, lý tưởng cho các tác vụ dài trên máy chủ từ xa.
  • Hiểu rõ hoạt động của các trình phân trang như Less giúp tránh nhầm lẫn giữa lối ra được phân trang với các thiết bị đầu cuối "bị chặn".

Ngăn chặn lệnh dừng thực thi khi đóng cửa sổ terminal trong Linux

Nếu bạn thường xuyên làm việc với terminal Linux , sớm muộn gì bạn cũng sẽ gặp phải tình huống điển hình này: bạn chạy một lệnh mất khá nhiều thời gian (ví dụ: rsync, find dung lượng lớn, script lớn , sao chép file, tải xuống youtube-dl…) và khi bạn đóng cửa sổ hoặc kết thúc phiên SSH, tiến trình đột ngột dừng lại. Đôi khi, bạn thậm chí còn mở một ứng dụng đồ họa (như gedit hoặc Firefox) từ console và khi bạn đóng terminal, ứng dụng đó cũng bị đóng theo.

Tin tốt là hệ thống cung cấp một số cách để tránh vấn đề này : bạn có thể giữ cho các lệnh của mình tiếp tục chạy ngay cả khi bạn đóng cửa sổ terminal, nếu kết nối SSH bị ngắt, và ngay cả khi bạn đăng xuất khỏi tài khoản người dùng của mình. Hãy cùng xem xét kỹ hơn cách hoạt động của các công cụ như `nohup` , `disown` , việc sử dụng `& `, điều khiển tiến trình bằng Ctrl+Z , và các lựa chọn thay thế nâng cao hơn như `screen` hoặc `tmux` , cùng với các mẹo thực tế để sử dụng hàng ngày.

Tại sao các tiến trình lại dừng khi cửa sổ terminal đóng lại?

Để hiểu cách ngăn một lệnh dừng lại khi bạn đóng cửa sổ dòng lệnh, trước tiên cần hiểu tại sao điều này xảy ra. Khi bạn mở một cửa sổ dòng lệnh (bash, zsh, v.v.) và thực thi một lệnh, tiến trình đó sẽ được liên kết với phiên làm việc của cửa sổ dòng lệnh và được coi là một "công việc" hoặc tác vụ của shell. Chừng nào cửa sổ dòng lệnh còn hoạt động, shell có thể hiển thị đầu ra và điều khiển quá trình thực thi của nó.

Khi bạn đóng cửa sổ terminal hoặc phiên SSH kết thúc , hệ thống sẽ gửi tín hiệu SIGHUP (hangup) đến các tiến trình liên quan . Tín hiệu này cho biết phiên điều khiển đã bị đóng. Nhiều chương trình sẽ chấm dứt hoạt động ngay lập tức khi nhận được tín hiệu SIGHUP, điều này giải thích tại sao các lệnh dài hoặc ứng dụng đồ họa lại ngừng chạy.

Mấu chốt là phải ngăn tín hiệu đó giết chết tiến trình hoặc "tách" lệnh khỏi cửa sổ dòng lệnh đã khởi chạy nó, để việc đóng cửa sổ dòng lệnh không còn ảnh hưởng đến lệnh nữa. Đó chính xác là những gì các tiện ích như nohup hoặc lệnh disown tích hợp sẵn của bash thực hiện , cùng với việc thực thi ngầm.

Hành vi này không chỉ ảnh hưởng đến các lệnh văn bản.Ví dụ, nếu bạn ném, gedit o firefox Từ cửa sổ dòng lệnh, chúng sẽ vẫn được liên kết với cửa sổ đó. Khi bạn đóng cửa sổ dòng lệnh, ứng dụng đồ họa cũng sẽ đóng lại, trừ khi bạn đã ngắt kết nối nó khỏi cửa sổ dòng lệnh một cách đúng cách.

Sử dụng lệnh `nohup` để đảm bảo lệnh vẫn tiếp tục chạy sau khi đóng cửa sổ terminal.

Sử dụng nohup trong Linux

Công cụ trực tiếp và đơn giản nhất cho những trường hợp này là nohupTên của nó xuất phát từ "no hang up" (không bị treo) và chức năng của nó rất cụ thể: làm cho tiến trình bỏ qua tín hiệu SIGHUP. Nói một cách đơn giản, nếu bạn đưa ra một lệnh với nohupQuá trình này sẽ tiếp tục ngay cả khi bạn đóng cửa sổ dòng lệnh, đóng cửa sổ giao diện đồ họa hoặc kết nối SSH bị gián đoạn.

Cú pháp cơ bản rất đơn giản.: nó được đặt nohup trước lệnh bạn muốn thực thi, và thường là một & Cuối cùng, để đưa nó vào chế độ nền:

nohup ./programa.sh &

Lệnh này thực sự có tác dụng gì? Một mặt, nohup Điều này báo cho hệ thống bỏ qua tiến trình SIGHUP. Mặt khác, khi đặt & Cuối cùng, bạn yêu cầu trình shell chạy lệnh trong nền, trả về dấu nhắc ngay lập tức để bạn có thể tiếp tục sử dụng thiết bị đầu cuối.

Bên cạnh đó, nohup tự động chuyển hướng đầu ra của chương trình vào một tệp có tên nohup.out Trừ khi bạn chỉ định khác, tập tin đó sẽ được tạo trong thư mục mà bạn chạy lệnh và sẽ lưu lại mọi thứ mà chương trình lẽ ra sẽ hiển thị trên màn hình. Nếu bạn muốn xem lại những gì đã xảy ra sau đó, chỉ cần làm điều gì đó như sau:

cat nohup.out

Điều này đặc biệt hữu ích cho các tác vụ quản trị hệ thống dài hạn : bạn có thể để một quá trình tìm kiếm, sao lưu , tập lệnh bảo trì hoặc tải xuống dung lượng lớn chạy, bình tĩnh đóng phiên SSH và kiểm tra kết quả sau.

  Hướng dẫn nâng cấp Ubuntu 24.04 lên Ubuntu 26.04 LTS từng bước một

Ví dụ thực tế: tìm kiếm hàng loạt với nohup

Ví dụ lệnh với nohup

Giả sử bạn muốn tìm tất cả các tệp trong thư mục /home của mình có dung lượng lớn hơn 100 MB.Việc đó có thể mất một chút thời gian, và có lẽ bạn không muốn bị chiếm quyền điều khiển thiết bị đầu cuối cho đến khi quá trình hoàn tất. Bạn có thể khởi chạy lệnh bằng cách sử dụng... nohup và chuyển hướng đầu ra của nó vào một tệp kết quả:

nohup find /home -type f -size +100M > ~/resultados &

Lệnh này bao gồm một số thành phần quan trọng :

  • nohup: khiến tiến trình bỏ qua việc phiên làm việc bị ngắt kết nối.
  • find /home -type f -size +100MTìm kiếm các tập tin thông thường trong thư mục /home có dung lượng lớn hơn 100 MB.
  • > ~/resultados: chuyển toàn bộ đầu ra chuẩn vào tệp ~/resultados, trong đó sẽ chứa danh sách các tệp được tìm thấy.
  • &Chạy lệnh này trong nền để bạn có thể khôi phục lại dấu nhắc lệnh của thiết bị đầu cuối.

Sau khi khởi chạy, bạn có thể đóng cửa sổ terminal hoặc phiên làm việc một cách an toàn ; quá trình tìm kiếm sẽ tiếp tục chạy ngầm. Sau này, khi đăng nhập lại, bạn có thể xem lại nội dung của tập kết quả bằng lệnh:

cat ~/resultados

Nếu bạn không muốn tạo bất kỳ tệp đầu ra nào. Hoặc nếu bạn muốn loại bỏ đầu ra và lỗi chuẩn, bạn có thể chuyển hướng nó đến... /dev/null:

nohup find /home -type f -size +100M > /dev/null 2>&1 &

Với sự kết hợp các lệnh chuyển hướng đó , cả đầu ra thông thường và thông báo lỗi đều biến mất, và tiến trình chạy ngầm mà không bị ảnh hưởng bởi tín hiệu treo.

Hoàn tất các tiến trình sau khi đăng xuất hoặc kết nối SSH bằng lệnh nohup.

Ngăn chặn tiến trình kết thúc khi đóng SSH.

Hành vi mặc định trong hầu hết các trình shell Lý do các tiến trình nền chấm dứt khi bạn đóng cửa sổ terminal là vì chúng bị chấm dứt, ngay cả khi bạn đã khởi chạy chúng bằng lệnh. &Điều này rất dễ thấy với một ví dụ đơn giản sử dụng sleep:

sleep 100 &

Thao tác này khởi động một quy trình chỉ đơn giản là chờ 100 giây.Nếu bạn điều hành một ps aux | grep sleep Bạn sẽ thấy tiến trình đang hoạt động. Nhưng ngay khi bạn đóng cửa sổ terminal và mở một cửa sổ khác, khi bạn liệt kê các tiến trình một lần nữa, bạn sẽ thấy rằng... sleep Ông ấy đã ra đi rồi.

Để lệnh đó vẫn được giữ nguyên sau khi đóng cửa sổ terminal. chỉ cần khởi chạy lại nó với nohup trước mặt:

nohup sleep 100 &

Công cụ đó sẽ tự động thông báo cho bạn. Điều đó có nghĩa là nó đang loại bỏ đầu vào chuẩn và sẽ chuyển đầu ra vào... nohup.outNếu bây giờ bạn làm ps aux | grep sleepBạn sẽ thấy quá trình đang diễn ra. Đóng cửa sổ terminal, mở một cửa sổ khác và liệt kê lại các lệnh: sleep Chức năng này sẽ vẫn hoạt động ngay cả khi bạn đăng nhập bằng tài khoản khác trên một thiết bị TTY khác.

Mô hình này cũng rất quan trọng khi làm việc qua SSH với máy chủ từ xa, Raspberry Pi hoặc VPS. Ví dụ, nếu bạn kết nối đến:

ssh [email protected]

Và bạn muốn bắt đầu một quá trình tải xuống dài với youtube-dl Thay vì phải giữ phiên SSH mở, bạn có thể làm như sau:

nohup youtube-dl https://www.youtube.com/playlist?list=LO_QUE_SEA >/dev/null 2>&1 &

Sau khi xem mã định danh quy trình và lấy lại dấu nhắc, giờ bạn có thể chạy exit Để đóng kết nối SSH, quá trình tải xuống sẽ tiếp tục mà không gặp sự cố và bạn có thể ngắt kết nối an toàn; sau đó bạn sẽ truy cập vào máy chủ để kiểm tra các tệp đã tải xuống.

Hãy nhớ rằng một số chương trình như wget Chúng đã được thiết kế để xử lý việc tạm dừng phiên khá tốt tùy thuộc vào cách bạn sử dụng chúng, nhưng với nohup Bạn cần đảm bảo rằng tiến trình không nhận được tín hiệu SIGHUP đáng sợ.

Đưa các tiến trình vào chạy nền: &, jobs, fg và bg

Vượt quá nohupGiao diện dòng lệnh Linux có hệ thống điều khiển tác vụ riêng. Điều này cho phép bạn tạm dừng, tiếp tục và di chuyển các tiến trình giữa chế độ nền trước và nền sau. Riêng điều này không ngăn chúng chấm dứt khi bạn đóng cửa sổ terminal, nhưng đó là nền tảng cần thiết để kết hợp chúng với các công cụ khác. disown.

Khi bạn thêm một & ở cuối lệnhBạn đang yêu cầu trình thông dịch lệnh (shell) chạy nó trong nền. Ví dụ:

rsync home/music/* usr/otro/home/music/ &

Giao diện dòng lệnh sẽ hiển thị cho bạn một cái gì đó tương tự như thế này. [1] 1234, ở đâu [1] là số hiệu công việc và 1234 PID (mã định danh tiến trình). Công việc đó vẫn đang hoạt động, nhưng cửa sổ dòng lệnh hiện đã rảnh để bạn nhập các lệnh khác.

Nếu thay vì sử dụng & Bạn khởi chạy lệnh như bình thường và sau đó bạn nhấn Ctrl + ZQuá trình sẽ bị tạm dừng. Một thông báo như sau sẽ xuất hiện:

  Hướng dẫn sửa lỗi GRUB từng bước trên GNU/Linux

[1]+ Stopped gedit

Hiện tại, lệnh đã bị dừng và không chạy . Bạn có thể xem các tác vụ đang hoạt động bằng lệnh:

jobs

Để tiếp tục chạy ở chế độ nềnbạn sử dụng bg Tiếp theo là số hiệu công việc:

bg 1

Nếu bạn muốn đưa nó trở lại phía trước (Để giành lại quyền kiểm soát thiết bị đầu cuối), bạn sẽ sử dụng fg 1Cách xử lý này Ctrl+Z, jobs, bg y fg Nó rất hữu ích khi bạn làm việc với nhiều tác vụ cùng lúc trên một thiết bị đầu cuối duy nhất.

fg 1

Ngắt kết nối một tiến trình khỏi thiết bị đầu cuối bằng lệnh disown.

Lệnh nội bộ disown từ bash Đó là mảnh ghép còn thiếu khi bạn đã có một tiến trình đang chạy và bạn quyết định không muốn nó dừng lại khi bạn đóng cửa sổ terminal, nhưng ban đầu bạn lại không khởi chạy nó bằng lệnh đó. nohupChức năng của nó là gì? disown Việc này bao gồm việc xóa tác vụ đó khỏi bảng tác vụ của shell và ngăn không cho nó nhận tín hiệu ngắt kết nối khi bạn đăng xuất.

Hãy tưởng tượng bạn mở gedit từ cửa sổ dòng lệnh vì bạn cần chỉnh sửa một tập tin nhỏ:

gedit archivo.txt

Cửa sổ gedit sẽ hiện lên trên màn hình máy tính của bạn , nhưng nếu bạn đóng cửa sổ terminal ngay bây giờ, trình soạn thảo cũng sẽ đóng theo. Nếu bạn muốn giữ gedit mở và có thể đóng cửa sổ console một cách an toàn, bạn có thể làm theo các bước sau:

1. Tạm dừng tiến trình bằng cách nhấn Ctrl+Z . Bạn sẽ thấy màn hình hiển thị tương tự như sau:

[1]+ Stopped gedit archivo.txt

2. Chạy disown -h %1 Để ngắt liên kết ứng dụng khỏi trình shell:

disown -h %1

các tùy chọn -h cho biết rằng công việc đó không nên nhận tín hiệu SIGHUP., Và %1 Điều này đề cập đến công việc số 1 (công việc bạn thấy khi nhấn Ctrl+Z). Bạn có thể kiểm tra các công việc bằng cách sử dụng... jobs Nếu bạn còn nghi ngờ về con số đó.

3. Đưa tiến trình vào chế độ chạy nền để tiếp tục hoạt động:

bg 1

Từ thời điểm này trở đi, gedit sẽ hoàn toàn độc lập với cửa sổ dòng lệnh . Bạn có thể đóng cửa sổ dòng lệnh một cách an toàn; cửa sổ trình soạn thảo sẽ vẫn mở và hoạt động. Thủ thuật này rất lý tưởng cho những người thường xuyên khởi chạy các ứng dụng đồ họa từ dòng lệnh.

Nếu bạn đã bắt đầu một chương trình với &, ví dụ gedit &, bạn sẽ tiết kiệm được bước này bg Vì tác vụ đã chạy ngầm nên bạn chỉ cần... disown -h %n tương ứng.

Một cách khác: từ chối quyền sở hữu đối với các lệnh đã chạy ngầm.

Trong các tác vụ nặng nhọc như sao chép với rsyncĐôi khi bạn nhớ ra mình muốn đóng cửa sổ terminal khi lệnh đang chạy. Nếu bạn đã khởi động nó bằng một lệnh nào đó... & Ngay từ đầu, việc tách nó khỏi bảng điều khiển thậm chí còn dễ dàng hơn khi sử dụng disown để khô.

Ví dụ, nếu bạn gõ :

sudo rsync home/music/* usr/otro/home/music/ &

Trình thông dịch lệnh sẽ trả về dấu nhắc. Và bạn có thể tiếp tục làm việc. Nếu sau này bạn quyết định đóng cửa sổ terminal nhưng không dừng quá trình đó lại. rsync, chỉ cần chạy:

disown

Không có tham số bổ sung, disown thực hiện công việc cuối cùng mà bạn đã lưu trong bảng công việc. Từ thời điểm đó trở đi, tiến trình sẽ không còn được điều khiển bởi shell nữa và sẽ không nhận được lệnh chấm dứt khi bạn đóng cửa sổ terminal.

Nếu bạn muốn trình bày rõ ràng hơn hoặc có nhiều công việc đang tiến hành, bạn có thể liệt kê chúng bằng cách:

jobs

Và sau đó áp dụng disown đặc biệt với một người:

disown %2

Trong nhiều trường hợp, bạn có thể lựa chọn giữa nohup y disown Tùy thuộc vào thời điểm bạn nhớ ra cần phải hoàn thành nhiệm vụ đó. Nếu bạn suy nghĩ kỹ trước khi bắt đầu, hãy sử dụng... nohupNếu sau này bạn nhớ ra, hãy dùng đến... disown.

Các phần mềm ghép kênh đầu cuối: screen, tmux và các phần mềm khác.

Ngoài nohup y disownCó những công cụ tiên tiến hơn như screen, tmux o byobu Họ đưa ra một giải pháp khác cho vấn đề này: thay vì ngắt kết nối các tiến trình riêng lẻ, họ tạo ra các phiên làm việc trên thiết bị đầu cuối liên tục mà bạn có thể kết nối và ngắt kết nối bất cứ khi nào bạn muốn.

Với bộ ghép kênh đầu cuối như tmux o screen Bạn có thể mở một phiên làm việc, chạy tất cả các lệnh trong đó (thậm chí nhiều "bảng điều khiển" hoặc "cửa sổ" trong cùng một phiên), rồi ngắt kết nối. Phiên làm việc sẽ tiếp tục chạy ngầm trên máy chủ, với tất cả các tiến trình hoạt động, ngay cả khi bạn đóng cửa sổ terminal hoặc kết nối SSH bị ngắt.

Sau đó, bạn có thể kết nối lại với phiên làm việc đó từ một thiết bị đầu cuối hoặc máy tính khác thông qua SSH và bạn sẽ thấy các chương trình chính xác như trạng thái ban đầu, với lịch sử thoát vẫn còn nguyên. Điều này giống như việc bạn có một thiết bị đầu cuối thường trực trên máy chủ.

  Làm thế nào để viết tài liệu kỹ thuật phần mềm hữu ích và dễ bảo trì?

Phương pháp này có phần phức tạp hơn để học. những điều đơn giản viết nohupNhưng nếu bạn thường xuyên làm việc với máy chủ từ xa, việc duy trì các tiến trình dài, các phiên tương tác (như trình soạn thảo văn bản ở chế độ văn bản) hoặc các công cụ giám sát đang chạy sẽ thuận tiện hơn rất nhiều.

Giữa screen y tmuxNhiều nhà quản trị hiện đại có xu hướng tmux vì nó linh hoạt và chủ động hơn trong quá trình phát triển, trong khi đó byobu Nó cung cấp thêm một lớp "thân thiện" nữa với các phím tắt mô tả chi tiết hơn và thanh trạng thái tích hợp.

Kiểm soát các bộ phân trang như Less khi truy vấn dịch vụ.

Một hành vi khác rất khó hiểu đối với người dùng mới. Đó là lệnh dành cho một số lệnh nhất định sử dụng trình phân trang, ví dụ như... less để hiển thị kết quả. Một trường hợp điển hình là: systemctl status sshd Trong các bản phân phối hiện đại như Fedora, nó mở đầu ra trong một loại "trình xem" hiển thị nội dung tương tự như "Dòng 1-22/22 [END]".

Trong trường hợp này, lệnh không bị treo.Bạn chỉ đơn giản là đang ở bên trong less (hoặc một trình xem trang khác) để xem nội dung. Để thoát và quay lại dấu nhắc mà không cần đóng cửa sổ terminal, chỉ cần nhấn:

Q

Chữ "q" (viết tắt của quit - thoát) sẽ đóng trình xem trang và đưa bạn trở lại giao diện dòng lệnh thông thường. Không cần phải tắt cửa sổ terminal hoặc mở một cửa sổ mới; chức năng này được thiết kế chính xác để bạn có thể điều hướng trong cửa sổ bằng các phím mũi tên, xem lại trang, tìm kiếm văn bản, v.v.

Trong nhiều lệnh hệ thống (các bản ghi(trạng thái dịch vụ, nhật ký hệ thống…) bạn sẽ thấy các mẫu tương tự. Khi bạn thấy một thông báo cho biết số dòng, tỷ lệ phần trăm hoặc [END], hãy nghĩ về less và trong quá trình ép q trước khi làm điều gì đó quyết liệt hơn.

Các trường hợp sử dụng thông thường hàng ngày

Trên thực tế, các công cụ này được kết hợp để giải quyết những tình huống rất cụ thể thường xuyên xảy ra khi làm việc trên Linux. Một số ví dụ điển hình:

1. Sao chép hoặc đồng bộ hóa dung lượng lớn (rsync, cp, mv)
Bạn muốn sao chép hàng gigabyte dữ liệu giữa các thư mục hoặc ổ đĩa và cần đóng cửa sổ đồ họa. Bạn có thể khởi chạy:

nohup rsync -avh /origen/ /destino/ > ~/rsync.log 2>&1 &

Bằng cách này, bạn sẽ nhận được nhật ký về những gì rsync đã thực hiện và bạn có thể ngắt kết nối mà không làm gián đoạn quá trình sao chép.

2. Các tìm kiếm phức tạp (find, du, các tập lệnh phân tích)
Để kiểm tra dung lượng ổ đĩa hoặc định vị các tệp lớn trên toàn bộ phân vùng, hãy sử dụng... nohup Việc chuyển hướng đến tệp kết quả gần như là bắt buộc nếu bạn biết quá trình này sẽ mất nhiều thời gian.

3. TÀI LIỆU Các tập lệnh lớn hoặc từ xa thông qua SSH
Bắt đầu youtube-dl, wget hoặc việc viết các đoạn mã dài trên máy chủ từ xa rồi ngắt kết nối là một trong những ưu điểm tốt nhất của nohup kết hợp với SSH.

4. Các ứng dụng đồ họa được mở từ thiết bị đầu cuối
Nếu bạn là một trong những người thường mở trình soạn thảo, trình duyệt hoặc công cụ đồ họa từ bảng điều khiển, disown Nó là người bạn tốt nhất của bạn để tránh việc cửa sổ dòng lệnh chiếm dung lượng trên màn hình máy tính một cách vô ích.

5. Thời gian làm việc dài trên máy chủ
Khi kết hợp nhiều lệnh tương tác hoặc phiên giám sát với nhau, việc sử dụng thường thuận tiện hơn. screen o tmux Vì vậy, bạn không cần phải lo lắng về điều gì sẽ xảy ra nếu kết nối của bạn bị ngắt.

Nắm vững các công cụ này cho phép bạn làm việc bình tĩnh hơn , không lo mất hàng giờ xử lý công việc vì đóng nhầm cửa sổ hoặc vì kết nối WiFi bị gián đoạn.

Tóm lại, ý tưởng chung rất đơn giản.Trong Linux, theo mặc định, các tiến trình được liên kết với cửa sổ terminal khởi chạy chúng và sẽ kết thúc khi cửa sổ terminal đó đóng lại, nhưng bạn có một số cơ chế để phá vỡ liên kết đó. nohup y disown Chúng bao gồm hầu hết các trường hợp sử dụng hàng ngày, và các bộ ghép kênh như... tmux o screen Họ còn tiến thêm một bước nữa bằng cách cung cấp các phiên làm việc liên tục. Thêm vào đó là chức năng điều khiển tác vụ (Ctrl+Z, bg, fg) và quản lý phân trang, chẳng hạn như... lessBạn có thể duy trì hoạt động trơn tru của các lệnh và ứng dụng ngay cả khi bạn đóng cửa sổ dòng lệnh, đăng xuất hoặc mất kết nối SSH.