Khi nào bạn cần 'nohup' nếu bạn đã sử dụng '&'?


26

Đầu tiên câu hỏi này có liên quan nhưng chắc chắn không giống với câu hỏi rất hay này:

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

Tôi muốn hiểu điều gì đó: khi tôi làm '&', tôi đang cố gắng phải không?

Có bao giờ hữu ích để làm "nohup ... &" hoặc chỉ đơn giản là & đủ?

Ai đó có thể hiển thị trường hợp bạn đang sử dụng '&' và vẫn muốn sử dụng 'nohup' không?


1
Bạn đã đọc câu trả lời được chấp nhận và chủ đề bình luận của nó? Họ giải thích những gì nohupkhông. Phần nào bạn đã nhầm lẫn?
Gilles 'SO- ngừng trở nên xấu xa'

3
@Gilles: có thể rõ ràng với bạn , bởi vì bạn tình cờ quen thuộc với những điều này (nhìn thấy đại diện của bạn) ... Tuy nhiên, để bắt đầu, câu trả lời được chấp nhận trong liên kết tôi đã đưa ra không nói một từ nào về việc sử dụng cả nohup và '&' ... Tôi khá chắc chắn rằng câu hỏi của tôi đủ rõ ràng và đủ khác biệt so với câu hỏi khác, và hai câu trả lời tuyệt vời ở đây dường như chứng minh điều đó; ) Ngoài ra, bạn có thực sự ngụ ý rằng tôi đã lấy nỗi đau để liên kết đến một câu hỏi khác, nhưng không đọc câu trả lời được chấp nhận!?
Cedric Martin

Câu trả lời:


32

Trước hết, mỗi khi bạn thực thi một lệnh, shell của bạn sẽ rẽ nhánh một tiến trình mới, bất kể bạn có chạy nó &hay không. &chỉ có nghĩa là bạn đang chạy nó trong nền.

Lưu ý điều này không chính xác lắm. Một số lệnh, như cdlà các hàm shell và thường sẽ không tạo ra một tiến trình mới. type cmdthường sẽ cho bạn biết liệu cmdmột lệnh bên ngoài hay hàm shell. type typecho bạn biết rằng typechính nó là một hàm shell.

nohuplà một cái gì đó khác nhau. Nó nói quá trình mới để bỏ qua SIGHUP. Đó là tín hiệu được gửi bởi kernel khi shell cha được đóng lại.

Để trả lời câu hỏi của bạn, hãy làm như sau:

  1. chạy emacs & (theo mặc định sẽ chạy trong một cửa sổ X riêng) .
  2. trên vỏ cha, chạy exit.

Bạn sẽ nhận thấy rằng emacscửa sổ bị giết, mặc dù đang chạy trong nền. Đây là hành vi mặc định vànohup được sử dụng chính xác để sửa đổi điều đó.

Điều hành một công việc trong nền (với &hoặc bg, tôi cá là các shell khác cũng có các cú pháp khác) là một tính năng shell, xuất phát từ khả năng của các hệ thống hiện đại để đa nhiệm. Thay vì forking một trường hợp vỏ mới cho mỗi chương trình bạn muốn khởi động, vỏ hiện đại ( bash, zsh, ksh, ...) sẽ có khả năng quản lý một danh sách các chương trình (hoặc công việc ). Chỉ một trong số chúng tại một thời điểm có thể ở phía trước , có nghĩa là nó được tập trung vào vỏ. Tôi ước ai đó có thể mở rộng hơn về sự khác biệt giữa một quá trình đang chạy ở nền trước và một trong nền (quy trình chính được chấp nhận stdin/stdout ).

Trong mọi trường hợp, điều này không ảnh hưởng đến cách quá trình con phản ứng SIGHUP. nohuplàm.


+1 cho cả hai bạn vì những câu trả lời tuyệt vời ... Nhưng tôi vẫn bối rối ... Tôi đã thử điều đó trước khi trả lời câu hỏi của mình: có thể thiết lập Debian Linux (rất cũ) của tôi không được cấu hình đúng nhưng nếu tôi "emacs & "Và sau đó gõ" exit ", chỉ thoát xterm của tôi: emacs vẫn ở đó.
Cedric Martin

Emacs đủ phức tạp để nó có thể tự xử lý SIGHUP. Theo mặc định, đó chỉ là quá trình thoát trên SIGHUP. Rất nhiều chương trình 'daemon' như ntpd hoặc inetd sẽ đọc lại cấu hình của chúng trên SIGHUP thay vì thoát. Bản thân tôi là một người vim, vì vậy tôi không có nhiều kinh nghiệm với bất kỳ emacs nào.
Bruce Ediger

3
Không có gì đặc biệt về emacs. Một shell thường gửi SIGHUPđến các tiến trình con của nó khi shell tự nhận SIGHUP, chứ không phải khi shell thoát bình thường. bash có một tùy chọn huponexitkhiến nó gửi SIGHUPcho trẻ em khi nó thoát, nhưng nó không được bật theo mặc định. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

xin chào. trước hết, giải thích tuyệt vời. Tôi đã cố gắng xác minh luận án của bạn bằng cách chạy một quy trình &và đóng vỏ của tôi bằng cách chạy exit. Quá trình vẫn đang chạy. Bất cứ ý tưởng về lý do tại sao nó đã không bị giết? Hay tôi đang thiếu một cái gì đó ở đây?
Ali Yılmaz

Quá trình bạn đang chạy là gì?
rahmu

16

Nó có bao giờ hữu ích để làm nohup ... & ? Vâng. Nếu bạn chỉ bắt đầu một quy trình "trong nền" với &, quy trình mới đó vẫn có tư cách thành viên trong "nhóm quy trình" của shell ban đầu. Nếu lớp vỏ hoặc nhóm quy trình đó nhận được một số tín hiệu nhất định (ví dụ SIGHUP), theo mặc định, chúng sẽ thoát. Điều này có nghĩa là nếu bạn chạy một quy trình với& bao bắt đầu bằng xterm hoặc rxvt hoặc một trình giả lập thiết bị đầu cuối cửa sổ khác, khi bạn đóng cửa sổ, quá trình nền sẽ có SIGHUP. Hầu hết các mã được viết ngẫu nhiên không xử lý SIGHUP và do đó thoát.

Nếu bạn làm nohup ... & , nohuplệnh sẽ đặt SIGHUP thành bị bỏ qua, và sau đó thực thi lệnh. Lệnh mới được thực thi đó giữ mặt nạ tín hiệunohup thiết lập, trừ khi lệnh tự xử lý một số tín hiệu. Nếu bạn đóng xterm hoặc rxvt hoặc bất cứ điều gì, kernel sẽ cung cấp SIGHUP cho quy trình của lệnh, bị bỏ qua. Nó cứ chạy.

Thực hiện một nohuplệnh cho phép nó tiếp tục chạy sau khi bạn đóng xterm hoặc bạn đăng xuất.


Xin lỗi - bạn đã mất tôi. Bạn có nói rằng việc sử dụng &với nohupgiữ cho lệnh chạy trong một số trường hợp nhất định khi chỉ sử dụng nohupsẽ không? Điều đó dường như mâu thuẫn với câu trả lời ở đây: unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB - "&" thực hiện các lệnh gọi / thực hiện các lệnh / hệ thống thực thi thông thường để đặt lệnh "trong nền". Đó là, lệnh được nohupped đang chạy không đồng bộ. Việc nohupthực hiện một số điều trước khi exec()hệ thống gọi để làm cho quá trình rẽ nhánh bỏ qua các tín hiệu nhất định. Vì vậy, vâng, "&" sẽ cho phép một lệnh chạy trong một số trường hợp nhất định mà một cái cũ đơn giản nohupsẽ không có. Giống như đóng xterm được liên kết với shell đã tạo ra nohup hoặc đăng xuất.
Bruce Ediger

-1

nếu bạn chạy một chương trình ở chế độ nền (có & là hậu tố) trên hệ điều hành linux và đăng xuất ngay cả sau đó thì nó vẫn tiếp tục chạy: hãy thử với:

  ping google.com > ping_result  &

Sau khi đăng nhập trở lại, hãy kiểm tra số lượng dòng trong tệp đầu ra ping_resultsẽ tiếp tục tăng có nghĩa là nó vẫn đang chạy tuy nhiên đã được thông báo rằng nó sẽ bị đóng. Sau đó, việc sử dụng nohuplệnh là gì.

một kịch bản khác ==> như đã nêu ở trên cho nohup emac &-> sẽ tiếp tục emacchạy sau khi đăng xuất hệ thống nhưng nó không hiển thị chạy sau khi đăng nhập trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.