다음 SSH 명령을 실행하고 있습니다.
ssh "root@$ip" 'nohup sh -s' < ./do_sync &
do_sync
내 목표는 원격 호스트에서 무언가(셸 스크립트)를 실행하는 것입니다. 자세히 설명하지 않기 때문에 이렇게 했습니다. 실제 스크립트 파일을 해당 컴퓨터로 전송하여 실행할 수 없었기 때문입니다.
관련이 있는지는 확실하지 않지만 원격 컴퓨터는 실제로 Android x86 장치입니다. 하지만 저는 안드로이드와 관련된 어떤 것도 하지 않았습니다. Java VM이 실행되고 있지도 않습니다. 이는 일부 busybox 유틸리티가 포함된 Android 버전의 Linux일 뿐입니다. 그렇지 않으며 그것이 사용하는 것은 매우 기본적이고 오래된 것 같습니다 bash
. sh
POSIX와 완전히 호환되는지는 확실하지 않습니다. 이제야 내가 원하는 동작을 수행하는 데 문제가 생겼으므로 OS와 관련된 경우를 대비해 이 세부 사항을 언급하고 싶었습니다.
이 명령은 작동하지만 ssh
프로세스는 백그라운드에서 활성 상태로 유지됩니다. 내가 기대하는 일은 다음과 같습니다.
- 스크립트가 즉시 반환되도록 백그라운드에서 SSH 명령을 실행합니다.
- SSH 명령은 호스트에 연결하고
sh -s ...
명령을 실행한 후 즉시 반환되어야 합니다. - 1단계의 SSH 프로세스가 종료되어야 합니다.
누구든지 내가 이런 행동을 하도록 도와줄 수 있나요? 내가 이 모든 작업을 수행하고 있는 컴퓨터에는 bash와 최신 버전의 sh가 있다는 점에 유의하세요. 하지만 원격 SSH 호스트에는 bash가 없으며 아주 오래된 버전일 뿐입니다 sh
. 이것이 중요한지 확실하지 않지만 어쨌든 공유하겠다고 생각했습니다.
편집 1
나도 이것을 시도했지만 동작은 동일합니다.
cat ./do_sync | ssh "root@$ip" &
편집: 해당 부분을 생략했기 때문에 이것이 작동하지 않는다는 것을 깨달았 nohup
지만 결국 동일한 차단 동작이 발생합니다.
cat ./do_sync | ssh "root@$ip" "nohup sh -s"
편집 2
또한 이것을 시도했지만 여전히 SSH 연결이 끊어지는 것을 방지합니다.
commands="$(cat ./do_sync)"
ssh "root@$ip" "nohup sh -c $commands"
이 경우 어떤 이유로 sh -s
전혀 작동하지 않습니다.
답변1
nohup의 트릭은 때때로 세 가지 표준 스트림을 모두 리디렉션하는 것입니다. 이것은 당신에게 도움이 될 것입니다:
cat ./do_sync | ssh root@ip "cat > /tmp/do_sync && chmod 777 /tmp/do_sync ; nohup /tmp/do_sync 2>/dev/null >/dev/null </dev/null &"
그러나 리디렉션이 없으면 nohup
차단됩니다.
답변2
또 다른 방법은
cat do_sync | ssh "root@ip" 'nohup sh -s'
나는 당신이 보고 있는 효과가 당신이 ./do_sync
백그라운드에서 실행되고 있기 때문이라고 가정합니다. 프로세스가 여전히 중단된 것처럼 보입니다. 실제로 열린 연결이 보이지 않는 한?