그래서 저는 스크립트(그런데 스크립트임)에서 ssh를 통해 시스템 A에서 시스템 B로 명령을 "지시"하고 이를 백그라운드로 보냅니다. 명령은 다음과 같습니다.
ssh -T MACHINEB SCRIPT &
머신 A에서 실행하는 스크립트는 시간 초과되지 않습니다. 때때로 나는 명령/스크립트의 지시사항이 머신 B에 존재한다는 것을 알아차렸지만(제가 요청한 경우) 일종의 멈춤 현상이 있었습니다. ps는 올바른 PID와 PPID를 표시하지만 그게 전부이며 완료되지 않습니다.
프로세스가 중단되는 원인이 무엇인지 찾으려고 노력 중입니다. 제 말은 이것이 코드와 관련이 있다는 것을 거의 확신한다는 것입니다. 다음 가능성과 여러분이 추가할 수 있는 다른 모든 것을 삭제하고 싶습니다.
원격 SSH 스크립트 실행을 실행할 때 내 프로세스가 SSH 세션에 연결됩니까? 그렇다면 A에서 B로 이동하는 네트워크 또는 SSH 문제가 있는 경우 내 프로세스가 영향을 받나요?
감사해요
답변1
ssh -T MACHINEB SCRIPT &
SCRIPT가 실행되는 동안 SSH 연결을 계속 실행하세요. 이 작업을 수행해야 하는 이유는 다음과 같습니다.
- SCRIPT가 출력을 생성하면 SSH는 이를 호스트에 전달해야 합니다.
- SCRIPT가 입력을 읽으면 SSH는 이를 호스트에서 중계해야 합니다.이건 좀 미묘할 수도 있는데.
- SCRIPT가 종료되면 SSH는 종료 상태를 클라이언트에 전송하고 프로세스는
ssh
해당 상태로 종료됩니다.
연결이 중단된 경우 SCRIPT는 stdin, stdout 또는 stderr를 읽거나 쓰려고 시도하지 않으면 영향을 받지 않습니다. 관련된 터미널이 없으므로 연결이 중단될 때 SCRIPT는 SIGHUP에 의해 종료되지 않습니다. 그러나 SCRIPT가 오류 메시지를 인쇄하려고 하면 메시지가 연결을 통해 전달됩니다.
두 가지 중 하나를 수행해야 합니다.
일괄 작업 접근 방식: SCRIPT가 입력을 허용하지 않고 표준 출력 및 표준 오류를 파일에 기록하는지 확인하세요.
ssh -T MACHINEB 'myprogram </dev/null >myprogram.log 2>&1'
대화형 방법: 스크린 멀티플렉서 내에서 SCRIPT를 실행합니다.화면또는멀티플렉서.
ssh -T MACHINEB screen -S somename -dm myprogram
이 스크린 세션에 연결하면 프로그램이 작동하는 모습을 볼 수 있습니다.
ssh MACHINEB screen -S somename -dr
프로그램이 종료되면 screen 세션도 종료됩니다. 프로그램의 출력과 오류를 보려면 이를 유지하려면 다음을 참조하세요.실행된 스크립트가 종료되면 GNU 화면이 세션을 종료하지 못하도록 방지
당신은 또한 볼 수 있습니다SSH 연결에서 완전히 연결이 끊긴 원격 명령 실행
답변2
귀하의 질문은 그다지 명확하지 않고 다소 혼란스럽습니다. 그러나 문제를 해결하기 위해 몇 가지 답변을 제공하려고 노력할 것입니다. 먼저 프로세스 ssh
는 MACHINEA에서 실행되고 SCRIPT는 MACHINEB에서 실행됩니다. 따라서 "&" 기호는 ssh
MACHINEB에서 실행되는 SCRIPT(셸) 프로세스가 아닌 MACHINEA의 명령 프로세스를 백그라운드로 둡니다. 따라서 MACHINEA의 (기본) 스크립트는 계속해서 (기본) 스크립트의 다음 명령을 실행하는 반면, MACHINEB는 "ssh" 세션에서 실행됩니다(MACHINEB의 경우 포그라운드). 따라서 A에서 B로의 연결 문제가 있는 경우 프로세스가 백그라운드에서 실행 중이기 ssh
때문에(아마도 중단되었을 수 있음) 명령이 MACHINEA의 기본 스크립트를 중지하지 않습니다 .ssh
답변3
스크립트를 실행하면 명령을 실행하는 하위 쉘이 생성됩니다. 실행 중인 백그라운드 프로세스(예: ssh 명령)를 포함한 모든 프로세스는 이 하위 쉘에 연결됩니다. 서브쉘이 종료되면 백그라운드 프로세스도 종료됩니다. 대신 스크립트 1에서 nohup 명령으로 ssh 프로세스를 실행해 보세요. 다음에서 영감을 받은 답변:스크립트에서 백그라운드 프로세스를 시작하고 스크립트가 끝나면 관리합니다.
SSH를 통해 전송된 명령은 SSH 프로세스에 연결되며 명령을 완료하려면 SSH 프로세스가 계속 실행되어야 합니다. SSH 프로세스를 종료하면 시스템 B의 모든 백그라운드 프로세스가 스크립트 2용으로 생성된 하위 셸에 연결되어 종료됩니다. Nohup은 여기서도 유용합니다.
그러나 프로세스가 머신 B에서 실행 중이지만 명백히 정지되고 조기 종료되지 않았기 때문에 ssh 프로세스의 조기 종료는 문제가 되지 않는 것 같습니다.
SSH 프로세스를 종료하고 머신 B에서 실행 중인 프로세스를 종료할 수 있으므로 네트워크 문제도 발생할 가능성이 낮습니다. 또한 네트워크 문제가 ssh 프로세스를 종료할 만큼 심각하지 않은 경우 시스템 B에서 실행 중인 프로세스에 영향을 주어서는 안 됩니다. 머신 B의 스크립트 2에 있는 무언가로 인해 지연이 발생할 가능성이 있습니다. 이 논리를 시연하는 한 가지 방법은 시스템 A에서 ssh 프로세스를 종료하고 시스템 B에서 어떤 일이 일어나는지 확인하는 것입니다.
결국 가장 좋은 옵션은 이전 링크에서 제안한 대로 ssh 명령을 nohup 프로세스로 실행하는 것입니다. 또한 스크립트 2의 명령이 순서에 종속되지 않는 경우 nohup을 사용하여 각 명령을 실행합니다. (https://askubuntu.com/questions/349262/run-a-nohup-command-over-ssh-then-disconnect). ssh 명령을 백그라운드 프로세스로 실행하고 있기 때문에 컴퓨터 A의 스크립트 1에는 스크립트 2의 실행에 의존하는 것이 없다고 가정합니다.