Sự khác nhau giữa ngôn ngữ <lệnh> & từ chối và trò chơi nohup <lệnh> và từ chối


41

Đây là hiểu biết của tôi về cách sử dụng &, disownnohup:

  • <command>: chạy quy trình trong phiên bản hiện tại của Terminal bash, ở nền trước (tức là quá trình được liệt kê dưới dạng bashcông việc nền trước và stdin, stdoutstderrvẫn bị ràng buộc với thiết bị đầu cuối ); không miễn dịch với hangouts ;
  • <command> &: chạy quy trình trong phiên bản hiện tại của Terminal bash, trong nền (tức là quá trình được liệt kê dưới dạng bashcông việc nền và stdin, stdoutstderrvẫn bị ràng buộc với thiết bị đầu cuối ); không miễn dịch với hangouts ;
  • <command> & disown: Chạy quá trình trong vòng hiện hành của Nhà ga bashVí dụ, ở chế độ nền , nhưng quá trình này được tách ra khỏi bashdanh sách 'việc làm s' (tức là quá trình không được liệt kê như là một bashcông việc foreground / nền và stdin, stdoutstderrvẫn còn ràng buộc với thiết bị đầu cuối ); miễn dịch với hangouts ;
  • nohup <command> & disown: Chạy quá trình trong vòng hiện hành của Nhà ga bashVí dụ, ở chế độ nền , nhưng quá trình này được tách ra khỏi bashdanh sách 'việc làm s' (tức là quá trình không được liệt kê như là một bashcông việc foreground / nền và stdin, stdoutstderrđang không còn ràng buộc với thiết bị đầu cuối ) ; miễn dịch với hangouts ;

Vì vậy, ngoài việc nohup <command> & disownngăn chặn stdinvà chuyển hướng stdoutstderrđể nohup.outtheo mặc định, có vẻ như với tôi như nó có thể được coi là hoàn toàn tương đương với <command> & disown.

Là tất cả trên đúng? Bất kỳ quan niệm sai lầm?


1
Bạn có ý nghĩa gì khi "miễn dịch với hangouts" và "không miễn dịch với hangouts"?
hỗn loạn

2
@chaos Ý tôi là việc chấm dứt / giết bashcá thể cha mẹ sẽ không giết quá trình
kos

Câu trả lời:


32

Hiểu biết của bạn về cơ bản là chính xác. Cả hai disownnohupđược sử dụng để cho phép bạn thoát khỏi phiên shell đang chạy mà không dừng công việc. Một số làm rõ:

  • Không có lý do để chạy nohup command & disown, nohupsẽ từ chối nó cho bạn.

  • nohupđược định nghĩa bởi POSIX trong khi disown thì không . Điều này có nghĩa rằng trong khi nhiều vỏ (ví dụ bash, zsh, ksh) có nó, những người khác (ví dụ tcsh, csh, dashsh) sẽ không có nó.

  • disowncó thể được sử dụng sau khi một lệnh đã được đưa ra trong khi nohupphải được sử dụng trước đó.

Theo như tôi có thể nói, hiệu quả thực tế của hai lệnh là như nhau. Mỗi cái đều có các tính năng mà cái kia thiếu (xem help disownman nohup) nhưng chức năng cơ bản của chúng là như nhau, vâng.

Để thảo luận chi tiết hơn về các công cụ này và sự khác biệt giữa chúng, hãy xem câu trả lời ở đây:


11
Nohupdisownkhông giống nhau và sử dụng cả hai lệnh cùng nhau là KHÔNG dư thừa. Xem câu trả lời này để biết mô tả chuyên sâu
bản ghi nhớ

7

Điểm đầu tiên đến điểm thứ ba của bạn có vẻ ổn, mặc dù đó stdin, stdout and stderr are still bound to the terminalkhông phải là một quan niệm đúng đắn. stdinluôn bị ràng buộc với thiết bị đầu cuối theo nghĩa là bạn sẽ luôn nhập tên tệp vào lệnh thông qua thiết bị đầu cuối hoặc cách sử dụng thiết bị đầu cuối. stdout and stderr are still bound to the terminalkhông sao

Bạn có stdin, stdout and stderr are not still bound to the terminalđiểm thứ tư không đúng như đã đề cập trong đoạn trước của tôi. Ngoài ra ở đây bạn đang sử dụng /dev/nulllàm tệp đầu vào command, ví dụ nếu lệnh là cat, bạn đang sử dụng nó dưới dạng cat /dev/null.

Lệnh trên điểm thứ 5 của bạn không được đặt chính xác, bạn đã sử dụng nohup <command> & disown, trong khi sử dụng bất kỳ một nohuphoặc disownmột trong những thứ khác là không cần thiết. Mục đích của chúng là giống nhau (để bỏ qua SIGHUP) nhưng chúng hoạt động theo một cách hơi khác. Vì vậy, lệnh có thể được đơn giản hóa như nohup <command> &.

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.