Chức năng của lệnh nohup là gì?


18

Tôi là người mới sử dụng Ubuntu. Tôi đã học được một lệnh

nohup [command]- chạy <command>miễn dịch với tín hiệu gác máy

Tôi không thể hiểu ý nghĩa của " miễn dịch với tín hiệu gác máy ". Nó đang nói về loại tín hiệu nào? Và xin vui lòng cho tôi biết làm thế nào để sử dụng lệnh này với một ví dụ.


Nếu có sẵn trong vỏ của bạn, disownlà một thay thế tốt hơn để nohup. Bối cảnh một lệnh với command &hoặc Ctrl-Z, sau đó sử dụng disownđể tách nó ra khỏi vỏ.
John Kugelman hỗ trợ Monica

@JohnKugelman không đủ , bạn cũng đã chuyển hướng luồng đầu vào, đầu ra và lỗi. Vậy tại sao không sử dụng 'nohup' mà điều này tự động cho bạn?
phép lạ173

Câu trả lời:


34

Hãy để chúng tôi xem xét bạn đã mở một gedittrình soạn thảo văn bản từ một thiết bị đầu cuối và làm việc trên nó. Nếu bạn đóng thiết bị đầu cuối trước khi đóng gedit, gedit cũng sẽ bị đóng ngay khi đóng thiết bị đầu cuối. Chuyện gì đang xảy ra ở đây vậy? Việc geditchạy như một quá trình con dưới thiết bị đầu cuối. Khi bạn đóng thiết bị đầu cuối, tín hiệu gác máy ( SIGHUP) được gửi đến quy trình giết chết tiến trình con.

Mặt khác, nếu bạn muốn con bạn xử lý (ở đây gedit) tiếp tục chạy ngay cả sau khi đóng thiết bị đầu cuối cha mẹ, bạn sẽ muốn quá trình của bạn miễn nhiễm với tín hiệu gác máy. Vì vậy, việc đóng thiết bị đầu cuối không đóng quá trình con. nohupthực hiện chính xác công việc này.

nohupkhông ngắt kết nối một lệnh từ thiết bị đầu cuối , nó làm cho tập lệnh của bạn bỏ qua SIGHUP và chuyển hướng stdout / stderr sang một tệp nohup.out, để lệnh có thể tiếp tục chạy trong nền sau khi bạn đăng xuất. Nếu bạn đóng shell / terminal hoặc đăng xuất, lệnh của bạn không còn là con của shell đó nữa. Nó thuộc về quá trình init. Nếu bạn tìm kiếm trong pstreebạn sẽ thấy nó hiện thuộc sở hữu của quy trình 1 (init). Điều đó không thể được đưa trở lại nền trước vì tiền cảnh không còn tồn tại.


16

Bên cạnh những gì @sourvac đã viết, đây là một di sản từ Back In The Day khi mọi người đăng nhập thông qua các thiết bị đầu cuối câm chỉ có văn bản, thường thông qua modem (bản gốc, tương tự 110 baud): "cúp máy" theo nghĩa đen là "cúp điện thoại" ".

Một pid miễn nhiễm với tín hiệu gác máy sẽ tiếp tục chạy ngay cả sau khi bạn đăng xuất và cúp điện thoại . Điều này rất hữu ích trên các máy tính chậm khi công việc chạy hàng giờ và bạn không thể đăng nhập (một người khác cần sử dụng thiết bị đầu cuối, bạn cần sử dụng điện thoại, tĩnh trong dòng có thể "làm mờ" kết nối , Vân vân).


1
Không chỉ trở lại trong ngày. Tôi chạy hầu hết các công việc lớn của mình trên cụm máy chủ mà tôi ssh vào. Nếu tôi không sử dụng nohup, tôi cần phải để máy tính xách tay của mình kết nối với các máy đó trong nhiều ngày trong khi chờ công việc kết thúc.
Ray

@ Trả lời những gì về việc chạy chúng thông qua "tại" hoặc như các công việc định kỳ?
RonJohn

@RonJohn Chắc chắn rồi. Hoặc thông qua một động cơ lưới. Tôi không có ý đề nghị nohup là lựa chọn duy nhất, chỉ là nó vẫn được sử dụng cho mục đích này ngày nay.
Ray

1
Có thể nhận xét lịch sử của bạn là chính xác. Nhưng kết luận của bạn về tầm quan trọng hiện tại của nó là sai. Nó không hữu ích trên các máy tính chậm nhưng nó hữu ích cho các công việc chạy dài. Đây là hai điều khác nhau. Bạn sử dụng 'nohup' để bảo vệ công việc của bạn trước sự ngắt kết nối dự định hoặc ngoài ý muốn của thiết bị đầu cuối của bạn. Ngay cả ngày nay bạn cũng không hài lòng nếu một công việc bị hủy bỏ vì lỗi mạng ngắt kết nối thiết bị đầu cuối của bạn và công việc của bạn bị hủy bỏ.
phép lạ173

@Ray Việc làm Cron hoàn toàn không phù hợp để đạt được điều này. Cronjobs là dành cho các nhiệm vụ định kỳ, bạn phải thiết lập môi trường trong cronjob và xem xét nhiều thứ khác. Có thể 'tại' dễ xử lý hơn một chút nhưng vẫn phức tạp hơn nohup.
phép lạ173
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.