nohup
연결이 끊어지거나 로그아웃해야 하는 경우에도 명령이 계속 실행될 수 있다는 것을 알게 되었습니다 . ssh 를 통해 원격 프로그램을 실행 중인데 nohup nice my command &
랩탑의 네트워크 연결이 끊어지면 터미널에 "Broken Pipe"라는 메시지가 표시되고 자동으로 종료됩니다. 다시 연결했을 때 작업이 손실되었습니다. 왜 그럴까요? 중단된 부분부터 다시 실행할 수 있나요?
답변1
이해해야 할 몇 가지 사항은 다음과 같습니다.
nohup
이것이 프로그램의 연결 끊김을 반드시 방지하는 것은 아닙니다. 이것이 하는 일은HUP
사용자가 로그아웃할 때 운영 체제가 보내는 신호를 마스크하는 것입니다(효과적으로 쉘을 제어함). 프로그램에 여전히 터미널에 연결된 파일 설명자가 있으면 프로그램이 중지되거나 종료될 수 있습니다. 이런 일이 발생하지 않도록 nohup은 일반적으로 stdout 및 stderr을nohup.out
stdin으로 리디렉션하고 닫습니다. 그러나 프로그램이 터미널의 파일 설명자를 열려고 시도하는 경우.쉘은 호출/세션 간의 "작업"을 추적하지 않습니다. 종료된 셸에 작업을 다시 연결할 수 없습니다. 몇 가지 해결책이 있습니다:
screen
또는 등의 터미널 에뮬레이터를 사용하면tmux
다른 터미널에 다시 연결할 수 있습니다. 여기서는 작업을 백그라운드에서 실행할 필요가 전혀 없습니다. 단지 포그라운드에서 실행하고 분리하기만 하면 됩니다(Ctrl-A d
usescreen
).시작된 작업의 PID를 추적합니다.
jobs -l
시작 후 이 명령을 사용하여 이 정보를 얻을 수 있습니다 . 새 셸이 작업을 기다리도록 하고 작업의 pid를 알고 있는 경우 다음 명령을 실행할 수 있습니다.wait <pid>
그러나 출력은 여전히 으로 전송되며 nohup.out
, 완료되었다는 유일한 단서는 명령 프롬프트가 다시 표시된다는 것입니다.