자일스설명하다
nohup과 disown은 모두 SIGHUP을 억제한다고 할 수 있지만 그 방식은 다릅니다. nohup은 프로그램이 처음에 신호를 무시하도록 합니다(프로그램이 이를 변경할 수 있음).nohup은 또한 제어 터미널 없이 프로그램 예약을 시도합니다., 터미널이 닫힐 때 커널이 SIGHUP을 보내지 않도록 합니다. disown은 순전히 쉘 내부에 있으며 SIGHUP을 보내지 않고 쉘이 종료됩니다.
$ nohup sleep 100 &
[1] 7882
nohup: ignoring input and appending output to 'nohup.out'
$ get-terminal-info-of-a-process.sh 7882
COMMAND CMD TT PID PPID CGNAME CGROUP PGID TPGID SESS SESSION OWNER
sleep 100 sleep 100 pts/5 7882 6780 systemd:/user.slice/user-10 7:pids:/user.slice/user-100 7882 7885 6780 c2 1000
$ tty
/dev/pts/5
ed 프로세스는 nohup
여전히 호출하는 shell과 동일한 tty를 갖습니다 /dev/pts/5
. 그래서 Gilles가 "nohup은 터미널이 닫힐 때 커널이 SIGHUP을 보내지 않도록 터미널을 제어하지 않고 프로그램을 예약하려고 시도합니다"라는 말의 의미가 무엇인지 궁금합니다.
그의 말이 사실이라면 어떻게 nohup
리눅스 API나 시스템 호출 기능을 통해 제어 터미널에서 프로그램을 분리할 수 있을까?
감사해요.
답변1
나는 차례로,설명하다, 실행 중인 프로세스는 nohup
여전히 로그인 세션 및 제어 터미널과 연결되어 있습니다. 결국 그것이 아니었다면 체조에는 아무 의미가 없을 것입니다.제어 터미널 정지 무시.
nohup
대상 프로그램을 체인 로딩하기 전에 표준 출력을 리디렉션하고 중단 신호를 무시하는 두 가지 작업을 수행하는 간단한 체인 로더입니다.
이것은nohup
FreeBSD의 코드,NetBSD에서,OpenBSD에서, 그리고TENEX C 케이스에서. 보시다시피 세션 조작이나 터미널 제어가 없습니다.