내 목표는 서버에 원격으로 SSH를 통해 접속하고, 화면을 시작하고, 스크립트를 시작하고, 스크립트를 실행한 다음 화면에서 내 Python 스크립트를 실행하는 동안 SSH 세션을 종료하는 것입니다. 이것이 내가 가진 것입니다:
ssh -t myuser@hostname screen python somepath.py -s 'potato'
문제는 실행 후 수동으로 Ctrl+A+D를 수행하고 SSH 세션을 직접 종료해야 한다는 것입니다. 사람의 개입 없이 이 모든 것을 한 번에 수행할 수 있는 방법이 있습니까?
편집: -dm을 사용하여 제안된 접근 방식을 시도했습니다.
더 쉽게 볼 수 있도록 테스트 중인 내용은 다음과 같습니다.
ssh -t user@host screen "top"
원격으로 나는 이것을 본다:
user 2557 0.0 0.2 27192 1468 ? Ss 13:35 0:00 SCREEN top
user 2562 0.0 0.1 11740 932 pts/0 S+ 13:35 0:00 grep --color=auto SCREEN
하지만 이렇게 하면:
ssh -t user@host screen -dm "top"
나는 즉시 호스트와의 연결을 끊었습니다. 내 grep에는 아무것도 없습니다
ps aux | grep SCREEN
user 2614 0.0 0.1 11740 932 pts/0 S+ 13:36 0:00 grep --color=auto SCREEN
답변1
-d -m
스크린 세션을 사용하여 다음을 수행 할 수 있습니다 .
ssh myuser@hostname screen -d -m "python somepath.py -s 'potato'"
그러면 명령을 실행하고 자동으로 해당 세션에서 사용자를 분리할 새 화면 세션이 생성됩니다.
이 옵션은 다음과 같이 문서화되어 있습니다.
-d -m
분리 모드에서 화면을 시작합니다. 그러면 새 세션이 생성되지만 연결되지는 않습니다. 이는 시스템 시작 스크립트에 유용합니다.
답변2
-d -m
해당 옵션은 작동하지만 따옴표에는 작동하지 않는다는 것을 알았습니다 . 나는 이것을 해야 한다:
ssh myuser@hostname screen -d -m python somepath.py -s 'potato'
허용된 답변에 명령 주위에 따옴표가 있는 이유를 모르겠습니다. GNU 문서에서는 필요하지 않고 내 시스템(Centos 7)에서는 이를 깨뜨렸기 때문입니다.
언급할 가치가 있는 점: Jenkins에서 SSH를 통해 실행할 때 화면이 활성 상태로 유지되지 않는 것을 확인했습니다. 상위 SSH가 연결되고 sh 스크립트가 실행 중일 때 활성화되지만 상위 SSH가 닫히면 종료되므로 화면에서 문제를 해결할 수 없는 상황이 발생할 수 있습니다.
나는 심지어 이 트릭을 사용해 보았습니다.
다음에 추가
script /dev/null
스크린콜 전에 해보았으나 문제가 해결되지 않았습니다. 젠킨스가 모든 것을 죽게 만드는 마법이 무엇인지는 모르겠지만 작동합니다.
Jenkins 프로세스 킬러에 의해 종료될 수 있으며 다음을 추가하여 비활성화할 수 있습니다.
export BUILD_ID=dontKillMe
https://serverfault.com/questions/502593/starting-a-forever-process-in-a-jenkins-build-step
내 경우에는 dontKillMe를 추가하여 장기 실행 프로세스(ssh 터널)를 계속 실행하는 행운을 누렸습니다. 하지만 불필요하기 때문에 더 이상 screen을 사용하지 않습니다.