0

私はシステムの展開エンジンを作成しています。各プロジェクトは、独自の展開手順を指定します。

ノードは EC2 で実行されています。

プロジェクトの 1 つは、サードパーティ アプリケーションのソース バージョンに依存しています。

具体的には:

cd /tmp
wget s3://.../tools/x264_20_12_2010.zip
unzip x264_20_12_2010.zip
cd x264_20_12_2010
./configure
make
checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default

現在、boto の ShellCommand (内部で subprocess.Popen を使用) でこれを行っています。これは次のようになります。

def deploy():
        ShellCommand("apt-get remove ffmpeg x264 libx264-dev")
        ShellCommand("apt-get update")
        ShellCommand("apt-get install -y build-essential checkinstall yasm texi2html libfuse-dev fuse-utils libcurl4-openssl-dev libxml2-dev mime-support libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev")

        ShellCommand("cd /tmp")
        s3cmd_sync("s3://.../tools/x264_20_12_2010.zip", "/tmp/x264_20_12_2010.zip")
        ShellCommand("unzip x264_20_12_2010.zip")
        ShellCommand("cd x264_20_12_2010")
        ShellCommand("./configure")
        ShellCommand("make")
        ShellCommand(r'checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default')

悲しいことに、サブプロセスに適用されるため、これは失敗します。cd /tmpつまり、親プロセスに戻って 2 番目の ShellCommand を発行すると、exeenv は親から継承されます。これにより、すべてを適用するシェル コマンドの実行フレームワークが必要であると考えるようになります。コンテキストを失うことなく、同じサブプロセス内のコマンド。

この問題の推奨される解決策は何ですか? コマンド ラインで実行されるアプリのログは非常に重要であることに注意してください (それなしでデバッグするにはどうすればよいでしょうか?)。これが、私が ShellCommand を気に入っている理由です... (興味がある場合は boto ログを参照してください)。

ありがとう、
マキシム。

4

2 に答える 2

0
  1. Popen("cd DIRECTORY") の代わりに os.chdir("DIRECTORY") を考えてください

  2. ここでは、コマンドごとに新しいシェルを実行しない方がよいかもしれません: 複数行のシェルスクリプトを 1 つ書くだけです。

deploy_commands = """apt-get foo apt-get bar cd baz ; ブーバット"""

Popen(deploy_commands, shell=True) 経由で実行を終了します。

ただし、信頼できないパラメーターをエスケープしないことについては、Popen ドキュメントのセキュリティ警告をお読みください。

于 2010-12-20T20:04:38.260 に答える
0

私はこれをやってしまった

def shell_script(appname, *commands):
        workspace = tempfile.mkdtemp(prefix=appname + '-')
        installer = open(workspace + "/installer.sh", 'w')

        installer.write("#!/bin/bash\n")
        installer.write("cd " + workspace + "\n")
        for line in commands:
                installer.write(line + "\n")
        ShellCommand("chmod u+x " + installer.name)
        installer.close()
        ShellCommand(installer.name)
于 2010-12-21T07:31:30.703 に答える