csh에 nohup이 없으면 ssh가 종료된 후에도 백그라운드 작업이 계속 실행됩니다.

csh에 nohup이 없으면 ssh가 종료된 후에도 백그라운드 작업이 계속 실행됩니다.

nohupSSH에서 백그라운드 명령을 사용해야 하는 필요성을 이해하려고 합니다 . 내 쉘은 CentOS에서 csh입니다.

  1. 아래의 백그라운드 명령은 ssh가 종료된 후에도 계속 실행됩니다. 나는 nohup명령 앞에 가 있는 경우에만 이런 일이 발생할 것으로 예상했습니다 .

    nohup필요한 시나리오는 무엇 입니까?

     ssh host 'sleep 80 >& /dev/null &'
    
  2. 또한 대화형 셸을 시도했는데 ssh가 종료된 후에도 백그라운드 작업의 PID가 여전히 호스트에 존재합니다.

     ssh host sleep 80 >& /dev/null & exit
    
  3. kill -HUP PID또한 대신을 사용하여 대화형 세션을 종료하려고 시도했는데 exitSSH가 종료된 후에도 백그라운드 작업의 PID가 여전히 호스트에 존재합니다.

내가 뭘 잘못하고 있는 걸까요?

답변1

아니, 아배경프로세스 그룹(작업)은 세션 리더(셸)가 종료되거나 해당 제어 터미널이 해체될 때 기본적으로 종료되지 않습니다.

이런 일이 발생하는 경우는 몇 가지 특별한 경우뿐입니다.

(1)백그라운드 작업은중지됨SIGHUP, 이 경우에 의해 / SIGCONT쌍의 신호가 전송됩니다.핵심. SIGHUP신호가 프로세스에 의해 포착되지 않거나 무시되지 않으면 프로세스가 종료됩니다.

중지된 작업의 정의는 중지된 프로세스를 포함하는 모든 작업입니다. 프로세스자고 있는nanosleep(2)또는 같은 차단 시스템 호출에서는 read(2)중지된 것으로 간주되지 않습니다.

(2)프로세스는 더 이상 존재하지 않는 터미널에 읽거나 쓰려고 시도하고, 시도할 때 발생하는 오류로 인해 종료됩니다.

(삼)직업은 사실전경직업. 그만큼핵심SIGHUP세션 리더/제어 프로세스(예: 셸)가 종료되면 전경 프로세스 그룹에 신호를 보냅니다 . 제어 프로세스는 SIGHUP제어 터미널이 해체될 때 자체적으로 신호를 받으며, 이로 인해 일반적으로 프로세스가 종료됩니다.

로 시작하는 명령도 &실제로는전경작업 제어가 없는 쉘에서 시작될 때 프로세스 그룹(csh가 아닌 대부분의 쉘에서는 실행 시 기본값임)스크립트그리고서브쉘).

(4)bash또는 와 같은 셸을 사용하고 있습니다 . 이 셸은 자체적으로 신호를 받을 때 (위의 3번 항목에 따라 셸이 제어 프로세스임) 모든 작업에 신호를 zsh보내 거나 단순히 종료될 때( 후자는 의 기본값일 뿐이고 기본값은 아니며 bash의 옵션이 적용됩니다.SIGHUPSIGHUPzshshopt huponexit

그만큼csh 쉘(실제 csh이거나 tcsh)그런 행동은 없어bash또는 에서 zsh. tcsh(실제에서는 아님 ) 쉘이 종료될 때 hup'ed되도록 내장 csh명령을 시작할 수 있습니다 .hup

tcsh% hup sleep 3600 &
tcsh% exit
$ pgrep sleep
[nothing]

(5)초기화 시스템은 종료된 사용자 세션을 정리하기 위해 노력합니다. 기본 구성에서는체계화된모든 프로세스에 신호를 보냅니다.범위지연 후에 SIGTERMa가 뒤따르 므로 어쨌든 도움이 되지 않습니다. 또한 systemd의 아이디어는SIGKILLnohup범위Unix 프로세스 세션과 일치하지 않으므로 명령을 실행해도 setsid(1)이스케이프되지 않습니다.

KillUserProcesses=yes, KillMode=control-group및 옵션의 기본값 KillSignal=SIGTERM을 조정하여 systemd의 동작을 변경할 수 있습니다 SendSIGKILL=yes.

관련 정보