環境
既存の稼働中のシステムにいくつかの要素を追加しています。いくつかのテスト スクリプトを実行している制御マシン (ローカルの Linux PC) があり、SSH 経由で複数の異なるマシンに多数のコマンドをリモートで送信する必要があります。テスト フレームワークはPythonで記述されており、 Fabricを使用してさまざまなマシンにアクセスします。
すべてのコマンドは、以下に簡略化された一般的な呼び出し関数で処理されます。
def cmd(host, cmd, args):
...
with fabric.api.settings(host_string=..., user='root', use_ssh_config=True, disable_known_hosts=True):
return fabric.api.run('%s %s' % (cmd, args))
通常、各マシンに送信される実際のコマンドには、リモート側で既存の python スクリプトを実行することが含まれます。system
これらの python スクリプトは、外部コマンドの呼び出し (およびを使用) を含むいくつかのジョブを実行しますsubprocess
。テスト PC で呼び出されたrun()
コマンドは、リモートの python スクリプトが完了すると返されます。
ある時点で、バックグラウンド タスクを起動するためにこれらのリモート python スクリプトの 1 つが必要でしたopenvpn --config /path/to/config.openvpn
。通常の python スクリプトでは、次のように使用します&
。
system('openvpn --config /path/to/config.openvpn > /var/log/openvpn.log 2>&1 &')
このスクリプトが Fabric 経由でリモートで呼び出される場合、ジョブをバックグラウンドで実行するにはnohup
、dtach
、などを明示的に使用する必要があります。screen
私はそれを動作させました:
system("nohup openvpn --config /path/to/config.openvpn > /var/log/openvpn.log 2>&1 < /dev/null &"
Fabric FAQでは、これに関する詳細が説明されています。特定のバックグラウンド コマンドでは問題なく動作します。
問題: すべての種類のバックグラウンド コマンドで機能しない
この手法は、必要なすべてのコマンドでは機能しません。一部のスクリプトでは、バックグラウンドatop
コマンドを起動し (これtop
は強化版です)、その stdout をファイルにリダイレクトする必要があります。
私のコード(注:atop -P
解析可能な出力に使用):
system('nohup atop -P%s 1 < /dev/null | grep %s > %s 2>&1 &' % (dataset, grep_options, filename))
そのコマンドを含むスクリプトが Fabric を介してリモートで呼び出されると、top プロセスはすぐに強制終了されます。出力ファイルは生成されますが、空です。SSH によってリモート マシンにログインしているときに同じスクリプトを呼び出すと、atop
コマンドは出力ファイルに定期的にデータをダンプします。
いくつかのグーグル検索と掘り下げにより、Fabric を使用したバックグラウンド ジョブに関する興味深い情報を得ることができましたが、私の問題は特定のタイプのバックグラウンド ジョブにのみ固有のようです。私はもう試した:
- 睡眠の追加
- pty=False で実行
nohup
に置き換えdtach -n
: 同じ症状- stdin が /dev/null にリダイレクトされた Fabric で top が失敗するなどのコマンドについて読みましたが、どうすればよいかわかりません。STDIN、STDOUT、およびSTDERRのさまざまな組み合わせまたは(非)リダイレクトをいじってみました
アイデアが尽きたようです。
ファブリックは、私たちがやっていることに対してやり過ぎのようです。「fabfile」メソッドはnose
フレームワークに統合されており、呼び出して実行するため、使用しませんnosetests
。手動の SSH コマンドを優先して Fabric をドロップすることに頼る必要があるかもしれませんが、新しいモジュールの 1 つをサポートしていないため、動作中のシステムを変更するという考えは好きではありません。