SSH를 사용하여 백그라운드에서 명령을 실행하고 세션을 분리하는 방법

StackOverflow https://stackoverflow.com/questions/1628204

  •  06-07-2019
  •  | 
  •  

문제

현재 원격 시스템에 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;'
도움이 되었습니까?

해결책

원격 머신/서버에서 일부 스크립트를 실행/시작하려는 상황이 있습니다 (자동으로 종료). 서버에서 연결을 끊습니다.

예 : 실행시 상자에서 실행되는 스크립트

  1. 모델을 가져 와서 원격 서버에 복사합니다.
  2. 모델로 시뮬레이션을 실행하기위한 스크립트를 작성하고 서버로 푸시합니다.
  3. 서버에서 스크립트를 시작하고 연결을 끊습니다
  4. 따라서 시작된 스크립트의 의무는 서버에서 시뮬레이션을 실행하고 일단 완료되면 (완료하는 데 며칠이 걸리면) 결과를 클라이언트에 복사하는 것입니다.

다음 명령을 사용합니다.

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 명령은 실제로 언급 된 화면/탭 내에서 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top