[bash] 대상 컴퓨터의 백그라운드에서 ssh가 명령을 실행하도록하기

이것은 쉘 스크립트에서 ssh를 어떻게 사용합니까? 에 대한 후속 질문입니다 . 질문. 해당 컴퓨터의 백그라운드에서 실행되는 원격 컴퓨터에서 명령을 실행하려면 ssh 명령을 어떻게 반환합니까? 명령 끝에 앰퍼샌드 (&)를 포함하려고하면 중단됩니다. 명령의 정확한 형태는 다음과 같습니다.

ssh user@target "cd /some/directory; program-to-execute &"

어떤 아이디어? 주목할 점은 대상 컴퓨터에 로그인하면 항상 텍스트 배너가 생성되고 SSH 키가 설정되어 있으므로 암호가 필요하지 않습니다.



답변

나는 1 년 전에 작성한 프로그램 에서이 문제를 겪었습니다. 답이 다소 복잡하다는 것이 밝혀졌습니다. 당신은에 위키 피 디아 기사에에 설명 된대로 출력 경로 재뿐만 아니라 nohup을 사용해야합니다 nohup을 사용자의 편의를 위해 여기에 복사.

백그라운드 작업의 Nohuping은 예를 들어 SSH를 통해 로그인 할 때 유용합니다. 백그라운드 작업은 경쟁 조건으로 인해 셸이 로그 아웃에서 정지 될 수 있기 때문입니다 [2]. 이 문제는 세 개의 I / O 스트림을 모두 리디렉션하여 극복 할 수도 있습니다.

nohup myprogram > foo.out 2> foo.err < /dev/null &

답변

이것은 나를 위해 그것을하는 가장 깨끗한 방법이었습니다.

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

이 이후에 실행되는 유일한 것은 원격 시스템의 실제 명령입니다.


답변

fd의 리디렉션

&>/dev/nullstderr 및 stdout을 모두 / dev / null로 리디렉션하는 출력을 리디렉션 해야하며 >/dev/null 2>/dev/null또는 의 동의어입니다 >/dev/null 2>&1.

패 랭스 인

가장 좋은 방법은 sh -c '( ( command ) & )'command가 무엇이든 사용 하는 것입니다.

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

노 h 껍질

nohup을 직접 사용하여 쉘을 시작할 수도 있습니다.

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

좋은 발사

또 다른 트릭은 nice를 사용하여 명령 / 쉘을 시작하는 것입니다.

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'


답변

연결을 열 수 없거나 유지할 수없는 경우 설치 권한이있는 경우 screen을 사용할 수 있습니다 .

user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &

스크린 세션을 분리하려면 : ctrl-a d

화면 세션을 나열하려면

screen -ls

세션을 다시 연결하려면

screen -d -r remote-command

화면은 각 세션 내에서 여러 개의 셸을 만들 수도 있습니다. tmux 에서도 비슷한 효과를 얻을 수 있습니다 .

user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &

tmux 세션을 분리하려면 다음을 수행하십시오. ctrl-b d

화면 세션을 나열하려면

tmux list-sessions

세션을 다시 연결하려면

tmux attach <session number>

기본 tmux 제어 키 ‘ ctrl-b‘는 사용하기가 다소 어렵지만 시도 할 수있는 tmux와 함께 제공되는 몇 가지 tmux 구성 예제가 있습니다.


답변

잘라서 붙여 넣을 수있는 실제 예제를 보여주고 싶었습니다.

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""


답변

가장 빠르고 쉬운 방법은 ‘at’명령을 사용하는 것입니다.

ssh user @ target “현재 -f /home/foo.sh”


답변

나는 당신이 원하는 것을 얻기 위해 두 가지 답변을 결합해야한다고 생각합니다. 세미콜론과 함께 nohup을 사용하고 모든 것을 따옴표로 묶으면 다음과 같은 결과가 나타납니다.

ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"

그것은 나를 위해 일하는 것 같습니다. nohup을 사용하면 실행할 명령에 &를 추가 할 필요가 없습니다. 또한 명령의 출력을 읽을 필요가 없으면 사용할 수 있습니다.

ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"

모든 출력을 / dev / null로 리디렉션합니다.