Tại sao một số chương trình chạy từ Terminal sử dụng '&' đóng khi Terminal không và các chương trình khác thì không?


27

Tôi chỉ tự hỏi, ví dụ khi tôi khởi chạy qtoxvới:

qtox &

Và sau đó đóng Terminal, qtoxđóng lại với nó. Tuy nhiên khi chạy etherapebằng cách sử dụng:

sudo etherape &

Đóng Terminal không đóng hoặc gây ra bất kỳ vấn đề nào đối với Etherape. Và trong số các ứng dụng khác nhau có hành vi khác nhau, một số đóng khi Terminal thực hiện, một số khác thì không, làm thế nào? Tại sao một số gần gũi khi những người khác không? Tôi đang chạy Ubuntu Gnome 15.10 với Gnome 3.18.


1
Có thể là bạn mở một thiết bị đầu cuối, bạn chạy qtox, bạn đóng thiết bị đầu cuối, tất cả các bạn !! Nhưng thứ hai là bạn mở thiết bị đầu cuối, sudo chạy etherape, bây giờ bạn đóng thiết bị đầu cuối của mình, nhưng sudo tiếp tục chạy cho đến khi sudo đóng?
Ken Mollerup

Chà, nếu bạn không muốn qtoxthoát khi bạn đóng thiết bị đầu cuối, bạn luôn có thể chạy nó với nohup qtox &.
Terrance

@Terrance: Chà, trong câu hỏi này tôi đặc biệt hỏi tại sao chứ không phải như thế nào ... Đó sẽ là câu hỏi khác của tôi ... :)

1
@ParanoidPanda À, điểm tốt. Lỗi của tôi. =)
Terrance

Câu trả lời:


36

Khi bạn đóng một thiết bị đầu cuối, thiết bị đầu cuối sẽ gửi tín hiệu SIGHUP đến trình bao; vỏ, lần lượt, gửi tín hiệu SIGHUP cho tất cả các nhóm quy trình con của nó, bao gồm các nhóm quy trình nền;

Làm thế nào mỗi quy trình đơn sẽ phản ứng với tín hiệu hoàn toàn theo quy trình: nếu quy trình không xác định trình xử lý tín hiệu và báo cho hạt nhân (thông qua một số tòa nhà như signal()hoặc sigaction()) mà nó muốn xử lý nó, thì nhân thực thi trình xử lý mặc định cho tín hiệu, trong trường hợp tín hiệu SIGHUP bao gồm việc kết thúc quá trình.

Tuy nhiên, khi bạn chạy một lệnh với sudo, UID của sudotiến trình và tiến trình con của nó được đặt thành 0(root); nói chung, trừ khi UID của quá trình gửi tín hiệu là 0(root) hoặc giống như quy trình đích, kernel sẽ loại bỏ tín hiệu (nghĩa là: một quá trình không thể gửi tín hiệu đến một quá trình do người dùng khác sở hữu, trừ khi quá trình đó gửi tín hiệu được sở hữu bởi root); đó là lý do tại sao một quy trình do người dùng chạy như phiên bản Bash do thiết bị đầu cuối chạy không thể SIGHUP một sudoquy trình và cuối cùng, việc đóng một thiết bị đầu cuối không ảnh hưởng đến quá trình bắt đầu sudo.


7
Và đó là lý do tại sao chúng ta cần nohuptrước những lệnh gần gũi với SIGHUP :) Upgoated
Sergiy Kolodyazhnyy

9
Tôi nghĩ không có gì kỳ diệu về sudo. sudochỉ chạy lệnh như một người dùng khác và bạn không thể gửi tín hiệu đến các quy trình của người dùng khác. Xem man 2 kill.
el.pescado

@ el.pescado Vậy là sudomột loại người nghèo nohup?
Hagen von Eitzen

7
@HagenvonEitzen Nếu bạn muốn, nhưng tôi rất kiềm chế việc chạy một lệnh không yêu cầu sudovới tác dụng phụ sudocủa nó nohup, hãy xem xét tất cả các nhược điểm khác.
kos

2
@Serg chúng tôi không cần nohup, nó tạo các nohup.outtệp không cần thiết sau nó. Thay vì sử dụng disownlệnh dựng sẵn.
Ruslan
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.