リモート マシンでサーバーを起動し、サーバー プロセスが接続しているポート番号を取得する必要があります。呼び出されると、サーバーはランダムなポートでリッスンし、stderr にポート番号を出力します。
リモート マシンへのログオン、プロセスの起動、ポート番号の取得のプロセスを自動化したいと考えています。" " という Python スクリプトを作成しました。このスクリプトinvokejob.py
はリモート マシン上にあり、ジョブを呼び出してポート番号を返すラッパーとして機能します。次のようになります。
import re, subprocess
executable = ... # Name of executable
regex = ... # Regex to extract the port number from the output
p = subprocess.Popen(executable,
bufsize=1, # line buffered
stderr=subprocess.PIPE
)
s = p.stderr.readline()
port = re.match(regex).groups()[0]
print port
インタラクティブにログインすると、次のスクリプトが機能します。
$ ssh remotehost.example.com
Last login: Thu Aug 28 17:31:18 2008 from localhost
$ ./invokejob.py
63409
$ exit
logout
Connection to remotehost.example.com closed.
(注: ログアウトに成功し、ハングしませんでした)。
ただし、コマンドラインから呼び出そうとすると、ハングするだけです。
$ ssh remotehost.example.com invokejob.py
2番目のケースでハングする理由と、これを回避するために何ができるかを知っている人はいますか?
プログラムの出力を取得する必要があることに注意してください。そのため、ssh の「-f」フラグを使用したり、標準出力をリダイレクトしたりすることはできません。