8

ssh 経由でリモート マシン上で nohup を使用してプロセスを開始したいと考えています。問題は、nohup で開始されたプロセスの PID を取得する方法です。そのため、外部シェル インスタンスなどではなく、「実際に何かを実行しているプロセス」です。また、stdout と stderr をファイルに保存したいのですが、それはここでは問題ではありません...

ローカルでは、使用して問題なく動作します

nohup sleep 30 > out 2> err < /dev/null & echo $!

コマンド「sleep 30」の正確な PID がエコーされます。これは、「top」または「ps aux|grep sleep」を使用して確認することもできます。

しかし、ssh経由でリモートで行うのに問題があります。私は次のようなものを試しました

ssh remote_machine 'nohup bash -c "( ( sleep 30 ) & )" > out 2> err < /dev/null'

しかし、「echo $!」をどこに置くべきかわかりません。ローカルシェルに表示されるようにします。たとえば、「bash」インスタンスなどの間違った PID が常に表示されます。

誰かがこれを解決する方法を考えていますか?

編集: OK、「bash -c」はここでは必要ないかもしれません。Lotharyx が指摘したように、私は正しい PID を使用して問題なく取得します

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!'

しかし問題は、「sleep 30」を「echo Hello World!」などの出力を生成するものに置き換えた場合、その出力はローカル側でもリモート側でもファイル「out」に終わらないことです。誰でも理由がわかりましたか?

EDIT2:私のせいです!他のデバイスにはスペースが残っていなかったため、ファイル「out」と「err」は空のま​​までした!

これは機能しています。さらに、セミコロン (;) で区切られた複数のコマンドを続けて呼び出したい場合は、次のように「bash -c」を使用できます。

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!'

次に、ローカル側の「bash -c」の PID を出力しますが、これで問題ありません。(「最も内側」または「ビジー」なプロセスの PID を取得することは不可能です。すべてのプログラム自体が新しいサブプロセスを生成する可能性があるため、見つける方法がありません...)

4

1 に答える 1

9

私は次のことを試しました (ローカル マシンは Debian、リモート マシンは CentOS です)。期待どおりに動作しました。

    ~# ssh someone@somewhere 'nohup sleep 30 > out 2> err < /dev/null & echo $!'
    someone@somewhere のパスワード:
    14193
    ~#

リモート マシンで ps -e を実行すると、次の行が表示されました。

    14193 ? 00:00:00 睡眠

したがって、明らかに、私のローカル マシンでは、出力はリモート マシンで実行されている「スリープ」の PID です。

SSH トンネル経由でコマンドを送信するときに、コマンドに bash を追加するのはなぜですか?

于 2012-09-28T21:15:29.487 に答える