次のSSHコマンドを実行しています。
ssh "root@$ip" 'nohup sh -s' < ./do_sync &
do_sync
私の目標は、リモートホストで何か(シェルスクリプト)を実行することです。詳しく説明しないのでこうしました。これは、実際のスクリプトファイルをそのコンピュータに転送して実行できなかったためです。
関係があるかどうかはわかりませんが、リモートコンピュータは実際にはAndroid x86デバイスです。しかし、私はAndroidに関する何もしませんでした。 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のトリックは、時々3つの標準ストリームをすべてリダイレクトすることです。これはあなたに役立ちます:
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
バックグラウンドで実行されているからだと仮定します。プロセスがまだ中断されているようです。実際に開いた接続が見えない限り?