編集1

編集1

次のSSHコマンドを実行しています。

ssh "root@$ip" 'nohup sh -s' < ./do_sync &

do_sync私の目標は、リモートホストで何か(シェルスクリプト)を実行することです。詳しく説明しないのでこうしました。これは、実際のスクリプトファイルをそのコンピュータに転送して実行できなかったためです。

関係があるかどうかはわかりませんが、リモートコンピュータは実際にはAndroid x86デバイスです。しかし、私はAndroidに関する何もしませんでした。 Java VMが実行されていません。これは、一部のbusyboxユーティリティを含むAndroidバージョンのLinuxです。そうではなく、それが使用することは非常に基本的で古いようですbashshPOSIXと完全に互換性があるかどうかはわかりません。これで私が望む動作を実行するのに問題が発生したので、OSに関連する場合に備えてこの詳細について言及したかったのです。

このコマンドは機能しますが、sshプロセスはバックグラウンドでアクティブのままです。私が期待することは次のとおりです。

  1. スクリプトがすぐに返されるようにバックグラウンドでSSHコマンドを実行します。
  2. SSHコマンドはホストに接続し、sh -s ...コマンドを実行した後すぐに返す必要があります。
  3. ステップ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バックグラウンドで実行されているからだと仮定します。プロセスがまだ中断されているようです。実際に開いた接続が見えない限り?

関連情報