스크립트 끝에서 SSH 연결을 강제로 종료하는 방법

스크립트 끝에서 SSH 연결을 강제로 종료하는 방법

두 부분으로 구성된 스크립트가 있습니다.1 부SSH 연결을 생성하고,2 부스크립트를 실행합니다(지금까지 약 800줄 포함).

part1:
ssh $target_server "bash -s" < $target_script

문제는2 부다음 줄을 포함합니다:

fc_START_WINE_APP () { nohup `DISPLAY=:11.0 wine "$1"` & }
. . .
fc_START_WINE_APP $applicationFull

기본적으로 애플리케이션이 실행 중인지 확인하고 그렇지 않은 경우 다시 시작합니다(및 기타 몇 가지 사항).

문제는 이 함수가 start애플리케이션에 실행될 때 SSH 연결이 중단된다는 것입니다.

SSH 연결이 스크립트 끝에 도달하면 강제 종료하는 방법이 있습니까?

등등 을 시도해 보았습니다 exit.exit 0exit 12 부. 나는 ssh -f전에 시도했다1 부그러나 이후에2 부구현되지 않은 것 같습니다.


업데이트 날짜: 2016-01-28

예는 다음과 같습니다

**SCRIPT1**
#!/bin/bash

target_server="1.2.3.4"
target_script="/home/user/script2.sh"

echo "Script 1 Started"

ssh $target_server "bash -s" < $target_script

echo "Script 1 Ended"

.

**SCRIPT 2**
#!/bin/bash

echo "Script 2 Started"

fc_START_WINE_APP () { nohup `DISPLAY=:11.0 wine "$1"` & }

applicationFull="/home/tech/myApp.exe"

fc_START_WINE_APP $applicationFull

echo "Script 2 Ended"

이 명령을 실행하면 도착 Script 2 Ended하지만 SSH 연결이 닫히지 않아 도착하지 않습니다 Script 1 Ended.

아시다시피, 이 스크립트의 요점은 지정된 서버에 연결하고 Wine을 사용하여 (이전 Windows) 응용 프로그램을 시작하는 것입니다.

내 이해는 마치 내가 직접 로그인(예: 퍼티 사용) 하고 실행한 다음 종료한 다음 계속 실행 nohup . . &되는 것처럼 애플리케이션이 닫히는 것을 중지하려면 ssh 연결이 닫힐 때 시작되어야 한다는 것입니다.nohup myCommand &myCommmand

답변1

프로그램을 분리할 때 두 출력을 모두 어딘가(/dev/null 또는 로그 파일)로 리디렉션하고 다음을 사용해야 합니다.

&>/dev/null &                         ...when bash --version >= 4

또는

>/dev/null 2>&1 &                     ...all shells

뿐만 아니라:

&

...이렇게 하면 ssh를 시작할 때 stdout, stderr에 대해 걱정할 필요가 없으며 종료할 수 있습니다.

nohup이 항상 중요한 것은 아닙니다(셸 구성 및 프로그램의 hup 신호 처리에 따라... 내 테스트에서는 'sleep', 'xclock' 및 'wine notepad.exe'가 nohup 없이 계속 작동함). nohup이 필요한 상황에서는 일반적으로 screen과 tmux가 더 나은 솔루션입니다.

bash >= 4라고 가정할 때 분리 동작을 테스트하는 최소 예는 다음과 같습니다.

ssh 1.2.3.4 "sleep 10 &"               ... exits after 10 seconds
ssh 1.2.3.4 "sleep 10 &>/dev/null &"   ... exits immediately

특정 script1/2의 경우 script2의 fc_START_WINE_APP 함수는 다음과 같아야 합니다.

{ DISPLAY=:11.0 wine "$1" &>/dev/null & }

...$1 값의 경우 "notepad.exe"는 잘 작동합니다...하지만 어떤 이유로든 여전히 nohup이 필요한 경우 명령은 하나만 허용하고 명령은 2개(디스플레이 설정 및 와인 실행)이므로 내부에 포장해야 합니다. 딸꾹질:

{ nohup bash -c "DISPLAY=:11.0 wine $1" &>/dev/null & }

답변2

내 생각에는 다음과 같은 방법을 찾은 것 같습니다.

part1:
ssh $target_server "bash -s" < $target_script > logfile.log 2> logfile.err &

이렇게 하면 두 번째 스크립트가 백그라운드에서 실행되는 동안 기본 스크립트가 즉시 완료됩니다.

답변3

당신의 SSH 세션제어 터미널이 필요합니다, 이 목적을 위해ssh -t

또는 part2ssh에서 직접 실행할 수도 있습니다. 따라서 파트 1은 다음과 같습니다.

**SCRIPT1**
#!/bin/bash

target_server="1.2.3.4"
target_script="/home/user/script2.sh"

echo "Script 1 Started"

scp $target_script $target_server:/tmp/my_script_part2.sh
ssh -t $target_server /tmp/my_script_part2.sh
ssh $target_server rm -f /tmp/my_script_part2.sh

echo "Script 1 Ended"

관련 정보