왜 터미널에서 '&'를 사용하여 터미널에서 실행되는 일부 프로그램이 닫히고 다른 프로그램이 닫히지 않습니까?


27

예를 들어 qtox다음과 같이 시작할 때 궁금합니다 .

qtox &

그런 다음 터미널을 qtox닫고 닫습니다. 그러나 다음을 etherape사용하여 실행할 때 :

sudo etherape &

Closing Terminal은 Etherape를 닫거나 문제를 일으키지 않습니다. 그리고 다른 응용 프로그램 중에는 다른 행동이 있습니다. 일부는 터미널이 닫을 때 닫히고 그렇지 않으면 어떻게됩니까? 다른 사람들이 없는데 왜 일부는 닫는가? 그놈 3.18과 함께 우분투 그놈 15.10을 실행하고 있습니다.


1
터미널을 열고 qtox를 실행하면 터미널을 닫을 수 있습니다. 그러나 두 번째는 터미널을 열고 sudo는 etherape를 실행하고 이제 터미널을 닫습니다. 그러나 sudo는 sudo가 닫힐 때까지 계속 실행됩니까?
Ken Mollerup

글쎄, 당신이 qtox터미널을 닫을 때 종료 하고 싶지 않다면 항상로 실행할 수 있습니다 nohup qtox &.
Terrance

@Terrance : 글쎄요,이 질문에서 저는 왜, 왜 그런지 묻지 않았습니다 ... 그것은 저의 다른 질문 일 것입니다 ... :)

1
@ParanoidPanda 아, 좋은 지적입니다. 내 잘못이야. =)
Terrance

답변:


36

터미널을 닫으면 터미널은 SIGHUP 신호를 쉘로 보냅니다. 쉘은 차례로 백그라운드 프로세스 그룹을 포함한 모든 자식 프로세스 그룹에 SIGHUP 신호를 보냅니다.

신호에 반응하는 각각의 단일 프로세스는 전적으로 과정에 얼마나 : 프로세스가 신호에 대한 핸들러를 정의하고 (일부 콜 등을 통해 커널을 얘기하지 않은 경우 signal()또는 sigaction()이 커널이 실행 그것을 처리하기를 원하는 것을) SIGHUP 신호의 경우 프로세스 종료로 구성되는 신호의 기본 핸들러.

그러나로 명령을 실행 sudo하면 sudo프로세스 의 UID 와 해당 자식 프로세스가 0(root)로 설정됩니다 . 일반적으로 신호를 보내는 프로세스의 UID가 0(루트) 또는 대상 프로세스와 동일하지 않으면 커널은 신호를 무시합니다 (예 : 프로세스가 아닌 한 프로세스는 다른 사용자가 소유 한 프로세스에 신호를 보낼 수 없음) 신호를 보내는 것은 루트가 소유합니다); 그렇기 때문에 터미널에서 실행하는 Bash 인스턴스와 같은 사용자 실행 프로세스는 sudo프로세스를 SIGHUP 할 수 없으며 결국 터미널을 닫아도 시작된 프로세스에는 영향을 미치지 않습니다 sudo.


7
우리가 필요로하는 이유입니다 nohupSIGHUP : Upgoated과의 긴밀한 할 그 명령 앞에
세르지 Kolodyazhnyy

9
에 대한 마술은 없다고 생각sudo 합니다. sudo다른 사용자로 명령을 실행하면 다른 사용자의 프로세스에 신호를 보낼 수 없습니다. 참조하십시오 man 2 kill.
el.pescado

@ el.pescado sudo어떤 종류의 가난한 사람 nohup입니까?
Hagen von Eitzen

7
당신이 원하는 경우 @HagenvonEitzen하지만, 내가보기 엔 필요없는 명령 실행을 자제 것 sudosudo의에 대한 nohup다른 모든 단점으로 간주 부작용을.
kos

2
@Serg 필요하지 않습니다. 필요하지 nohup않은 nohup.out파일을 생성 합니다. disown내장 명령을 사용하십시오 .
Ruslan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.