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)백그라운드 작업은중지됨SIGHUPSIGCONT, 이 경우 한 쌍의 신호 로 전송됩니다 /핵심. 프로세스가 신호를 포착하지 못하거나 무시 하면 SIGHUP프로세스가 종료됩니다.

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

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

(삼)이 직업은 실제로전망일하다. 이것핵심SIGHUP세션 리더/제어 프로세스(예: 셸)가 종료되면 포그라운드 프로세스 그룹에 신호를 보냅니다. SIGHUP제어 터미널이 제거되면 제어 프로세스 자체가 신호를 수신하며, 이로 인해 일반적으로 터미널이 종료됩니다.

로 시작하는 명령도 &실제로는전망작업 제어 없이 쉘에서 시작되는 경우(csh가 아닌 대부분의 쉘에서는 런타임의 기본값임)스크립트그리고서브쉘).

(4)bash또는 자체적으로 신호를 수신할 zsh때 (쉘은 위의 3번 항목에 따른 제어 프로세스임) 또는 종료할 때(후자는 의 기본값일 뿐이며 기본값은 아니며 옵션의 적용을 받음 )와 같은 셸을 사용하고 있습니다. 세게 때리다).SIGHUPSIGHUPzshshopt huponexit

이것껍데기(실제 csh또는 tcsh)그런 행동은 없어bash또는 에서 zsh. (실제 에서는 tcsh아님 csh) 내장 명령 실행기를 사용하여 hup쉘이 종료될 때 이를 실행할 수 있습니다.

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

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

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

관련 정보