SSH를 사용하여 프로세스를 원격으로 시작


18

제어하에 여러 시스템에 새 서비스를 푸시하고 배포하는 데 사용하는 스크립트를 작성했으며 프로세스를 실행하기 위해 ssh를 사용하여 프로세스를 원격으로 시작하고 있습니다. 불행히도 SSH를 사용하여 프로세스를 시작할 때마다 SSH 명령이 반환되지 않아 스크립트가 중단됩니다.

명령은 ssh $ user @ $ host "/ root / command &"로 지정됩니다. ps 또는 who와 같은 간단한 명령을 실행할 때마다 SSH 명령이 즉시 반환되지만 프로세스를 시작하려고하면 반환되지 않습니다. 프로세스를 시작한 다음 종료하는 간단한 bash 스크립트로 프로세스를 래핑하는 것과 같은 트릭을 시도했지만 SSH 명령도 중단됩니다 (bash 스크립트가 성공 메시지를 표시하고 정상적으로 종료 되더라도).

누구 든지이 동작의 원인에 대한 통찰력이 있으며 프로세스가 시작되는 즉시 SSH 명령을 반환하는 방법은 무엇입니까?

통찰력에 감사드립니다!


사용중인 정확한 명령 줄 게시 ... 암호 / 사용자 이름 / IP 생략
Joseph Kern

ssh $ SSH_USER @ $ HOST_ADDR "/ root / AppName &"
rmrobins

SSH 키를 설정 했으므로 원격 시스템에서 명령을 실행하기 위해 비밀번호를 사용할 필요가 없습니다.
rmrobins

@rmrobins, 매우 좋은 단계-공개 키 인증 설정.
nik

답변:


28

SSH는 원격 쉘의 stdin, stdout 및 stderr을 로컬 터미널에 연결하므로 원격 측에서 실행중인 명령과 상호 작용할 수 있습니다.

부작용으로, 이러한 연결이 닫힐 때까지 계속 실행됩니다. 이는 원격 명령과 모든 하위 (!)가 종료 된 경우에만 발생합니다 ( "&"가 시작되는 하위 항목 때문에 표준에서 부모 프로세스를 열고 열어 두십시오).

따라서 다음과 같은 것을 사용해야합니다.

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<,> 및 2> & 1은 stdin / stdout / stderr을 터미널에서 멀리 리디렉션합니다. "&"는 스크립트를 백그라운드로 이동시킵니다. 프로덕션에서는 물론 stdin / err를 적절한 로그 파일로 리디렉션합니다.

보다

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

편집하다:

< /dev/null위 의 내용이 필요하지 않다는 것을 알았습니다 (그러나 stdout / err를 리디렉션하는 것은입니다 ). 왜 그런지 모르겠다 ...


고마워, 이것은 내가 찾던 것입니다-백그라운드에서 &를 사용하여 시작하더라도 프로세스가 std *를 상속한다는 것은 나에게 발생하지 않았습니다.
rmrobins

+1! 나를 위해 작동합니다. 또한 로그 파일을 에코하여 출력을 인쇄 할 수도 있습니다. ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Fishdrowned

5

당신은 nohup을 시도 할 수 있습니다. 자세한 내용은 Man nohup을 참조하십시오.

ssh host "nohup script &"

원격 시스템에서 출력을 유지하려면 변형이 있습니다.

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

또 다른 대안은 screen(1)다음과 같은 분리형 을 실행하는 것입니다.

ssh -l user host "screen -d -m mycommand"

그러면 분리 된 화면 (화면 내부의 모든 상호 작용을 캡처)이 시작된 다음 즉시 돌아와서 ssh 세션이 종료됩니다.

좀 더 독창적으로이 방법으로 매우 복잡한 원격 명령 호출을 해결할 수 있습니다.


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
이 방법의 문제는 SSH 명령이 실제로 종료되지 않고 단순히 배경에 숨겨져 있으므로 스크립트를 실행하는 호스트는 SSH 명령이 절대로 반환되지 않기 때문에 백그라운드에서 절대로 많은 수의 SSH 명령을 갖지 않는다는 것입니다 ( 즉 내가 해결하고자하는 근본 문제)
rmrobins

-1

나는 올바른 방법이 될 것이라고 생각

ssh user@host exec script.sh &

아니요, 저에게는 효과가 없습니다. 왜 그래야합니까?
sleske

나는 ssh에 대한 배경 푸시를 사용하지 않았으며, 용어없이 시도했다. 내 잘못이야.
nik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.