안돼, 잘했어, 연결이 끊기면 중단해

안돼, 잘했어, 연결이 끊기면 중단해

nohup연결이 끊어지거나 로그아웃해야 하는 경우에도 명령이 계속 실행될 수 있다는 것을 알게 되었습니다 . ssh 를 통해 원격 프로그램을 실행 중인데 nohup nice my command &랩탑의 네트워크 연결이 끊어지면 터미널에 "Broken Pipe"라는 메시지가 표시되고 자동으로 종료됩니다. 다시 연결했을 때 작업이 손실되었습니다. 왜 그럴까요? 중단된 부분부터 다시 실행할 수 있나요?

답변1

이해해야 할 몇 가지 사항은 다음과 같습니다.

  1. nohup이것이 프로그램의 연결 끊김을 반드시 방지하는 것은 아닙니다. 이것이 하는 일은 HUP사용자가 로그아웃할 때 운영 체제가 보내는 신호를 마스크하는 것입니다(효과적으로 쉘을 제어함). 프로그램에 여전히 터미널에 연결된 파일 설명자가 있으면 프로그램이 중지되거나 종료될 수 있습니다. 이런 일이 발생하지 않도록 nohup은 일반적으로 stdout 및 stderr을 nohup.outstdin으로 리디렉션하고 닫습니다. 그러나 프로그램이 터미널의 파일 설명자를 열려고 시도하는 경우.

  2. 쉘은 호출/세션 간의 "작업"을 추적하지 않습니다. 종료된 셸에 작업을 다시 연결할 수 없습니다. 몇 가지 해결책이 있습니다:

    1. screen또는 등의 터미널 에뮬레이터를 사용하면 tmux다른 터미널에 다시 연결할 수 있습니다. 여기서는 작업을 백그라운드에서 실행할 필요가 전혀 없습니다. 단지 포그라운드에서 실행하고 분리하기만 하면 됩니다( Ctrl-A duse screen).

    2. 시작된 작업의 PID를 추적합니다. jobs -l시작 후 이 명령을 사용하여 이 정보를 얻을 수 있습니다 . 새 셸이 작업을 기다리도록 하고 작업의 pid를 알고 있는 경우 다음 명령을 실행할 수 있습니다.

      wait <pid>
      

그러나 출력은 여전히 ​​으로 전송되며 nohup.out, 완료되었다는 유일한 단서는 명령 프롬프트가 다시 표시된다는 것입니다.

관련 정보