SSH를 사용하여 백그라운드에서 명령을 실행하고 세션을 분리하는 방법
문제
현재 원격 시스템에 SSH로 접속하여 스크립트를 실행하려고 시도 중입니다. 그런 다음 스크립트가 실행 중인 상태로 노드를 그대로 둡니다.아래는 내 스크립트입니다.그러나 실행하면 스크립트가 머신에서 성공적으로 실행되지만 SSH 세션이 중단됩니다.뭐가 문제 야?
ssh -x $username@$node 'rm -rf statuslist
mkdir statuslist
chmod u+x ~/monitor/concat.sh
chmod u+x ~/monitor/script.sh
nohup ./monitor/concat.sh &
exit;'
해결책
원격 머신/서버에서 일부 스크립트를 실행/시작하려는 상황이 있습니다 (자동으로 종료). 서버에서 연결을 끊습니다.
예 : 실행시 상자에서 실행되는 스크립트
- 모델을 가져 와서 원격 서버에 복사합니다.
- 모델로 시뮬레이션을 실행하기위한 스크립트를 작성하고 서버로 푸시합니다.
- 서버에서 스크립트를 시작하고 연결을 끊습니다
- 따라서 시작된 스크립트의 의무는 서버에서 시뮬레이션을 실행하고 일단 완료되면 (완료하는 데 며칠이 걸리면) 결과를 클라이언트에 복사하는 것입니다.
다음 명령을 사용합니다.
ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'
@Ckeven, 모든 명령을 하나의 스크립트에 넣고 원격 서버로 푸시하여 다음과 같이 시작할 수 있습니다.
echo '#!/bin/bash
rm -rf statuslist
mkdir statuslist
chmod u+x ~/monitor/concat.sh
chmod u+x ~/monitor/script.sh
nohup ./monitor/concat.sh &
' > script.sh
chmod u+x script.sh
rsync -azvp script.sh remotehost:/tmp
ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'
이것이 효과가 있기를 바랍니다 ;-)
편집 : ssh user@host 'screen -s sessionname -d -m "/path/to/executable"도 사용할 수도 있습니다.
분리 된 화면 세션을 생성하고 그 안에서 대상 명령을 실행합니다.
다른 팁
사용하는 것에 대해 어떻게 생각하시나요? screen
이것을 위해?당신은 달릴 수 있습니다 screen
ssh를 통해 명령을 시작합니다(concat.sh
) 그런 다음 모니터링하려는 경우 screen 세션으로 돌아갈 수 있습니다(concat의 기능에 따라 편리할 수 있음).
좀 더 구체적으로 설명하려면 다음을 시도해 보세요.
ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh
프롬프트가 즉시 반환되고, concat.sh
원격 시스템에서 실행 중입니다.몇 가지 옵션에 대해 설명하겠습니다.
ssh -t
TTY를 만듭니다.화면에는 이것이 필요합니다.screen -dm
"분리" 모드에서 시작됩니다.이는 귀하의 목적에 맞는 "배경"과 같습니다.-S
테스트에서는 스크린 세션에 이름을 부여합니다.선택사항이지만 권장됩니다.
이제 이 작업을 완료한 후에는 원격 컴퓨터로 이동하여 다음을 실행할 수 있습니다.
screen -r testing
그러면 프로그램이 포함된 스크린 세션에 연결됩니다.거기에서 제어하고, 종료하고, 출력을 보는 등의 작업을 수행할 수 있습니다.Ctrl-A를 누른 다음 d를 누르면 화면 세션에서 분리됩니다. screen -ls
실행 중인 모든 세션을 나열합니다.
표준 입력 스트림 일 수 있습니다. 노력하다 ssh -n ...
또는 ssh -f ...
.
나에게는 이것이 효과가 있었다.
screen -dmS name sh my-script.sh
물론 이것은 화면에 따라 다르며 stdin 또는 stdout을 원한다면 나중에 첨부 할 수 있습니다. my-script.sh가 끝나면 화면이 종료됩니다.
아래는 찾기 위해 약간의 노력이 필요한 훨씬 더 일반적인 결정이며, 실제로 저에게 효과적입니다.
#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"
echo "this is a test"
ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \"
$theStuff
\""
화면 세션의 $ THETABNUMBER의 $ THESTUFF 명령 목록을 '사용자'를 대신하여 '서버'에서 예비 적으로 생성 한 이름을 탭합니다.
'물건'옵션의 글리치를 극복하기 위해 보내진 -x witch "이후의 후행 공백에주의하십시오. 다음 줄의 공백과 $ thestuff는 'enter'(^m) 키 스트로크에 의해 추가됩니다. 놓치지 마십시오. '여자 이름!
"이것은 테스트입니다"메시지는 초기 터미널에서 반향되며 $ thestuff 명령은 실제로 언급 된 화면/탭 내에서 실행됩니다.