1

環境

既存の稼働中のシステムにいくつかの要素を追加しています。いくつかのテスト スクリプトを実行している制御マシン (ローカルの 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 経由でリモートで呼び出される場合、ジョブをバックグラウンドで実行するにはnohupdtach、などを明示的に使用する必要があります。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 を使用したバックグラウンド ジョブに関する興味深い情報を得ることができましたが、私の問題は特定のタイプのバックグラウンド ジョブにのみ固有のようです。私はもう試した:

アイデアが尽きたようです。

ファブリックは、私たちがやっていることに対してやり過ぎのようです。「fabfile」メソッドはnoseフレームワークに統合されており、呼び出して実行するため、使用しませんnosetests。手動の SSH コマンドを優先して Fabric をドロップすることに頼る必要があるかもしれませんが、新しいモジュールの 1 つをサポートしていないため、動作中のシステムを変更するという考えは好きではありません。

4

1 に答える 1

0

私の環境では、動作しているようです

from fabric.api import sudo

def atop():
    sudo('nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log --line-buffered 2>&1 &',
        pty=False)

結果:

fabric:~$ fab atop -H web01
>>>[web01] Executing task 'atop'
>>>[web01] sudo: nohup atop -Pcpu 1 </dev/null | grep cpu > /tmp/log --line-buffered 2>&1 &
>>>
>>>Done.

web01:~$ cat /tmp/log 
>>>cpu web01 1374246222 2013/07/20 00:03:42 361905 100 0 5486 6968 0 9344927 3146 0 302 555 0 2494 100
>>>cpu web01 1374246223 2013/07/20 00:03:43 1 100 0 1 0 0 99 0 0 0 0 0 2494 100
>>>cpu web01 1374246224 2013/07/20 00:03:44 1 100 0 1 0 0 99 0 0 0 0 0 2494 100
...

top コマンドにはスーパーユーザーが必要な場合があります。これは機能しません

from fabric.api import run

def atop():
    run('nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log --line-buffered 2>&1 &',
        pty=False)

一方でこの作品。

from fabric.api import run

def atop():
    run('sudo nohup atop -Pcpu 1 </dev/null '
        '| grep cpu > /tmp/log --line-buffered 2>&1 &',
        pty=False)
于 2013-07-19T15:26:55.223 に答える