2010-12-20 21 views
0

システム用のデプロイメントエンジンを作成しています。各プロジェクトでカスタムデプロイメントの指示が指定されています。サブプロセス間の環境状態を維持する.Popenコマンド?

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

プロジェクトの1つは、サードパーティアプリケーションのソースバージョンによって異なります。

は、具体的に:cd /tmpので、

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 
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 

現在、私は(内部的にsubprocess.Popenを使用しています)のbotoのにShellCommandでこれをやっているが、これは次のようになりますサブプロセスに適用されます。つまり、私が父のプロセスを返し、2番目のShellCommandを発行すると、exeenvは父から継承されます。私はシェルコマンドの実行フレームワークが必要ですコンテキストを失うことなく、同じサブプロセス内のコマンド。

この問題の推奨解決策は何ですか?コマンドラインで実行されるアプリのログは非常に重要です(どうすればデバッグなしでデバッグできますか)。これはShellCommandが好きな理由です(興味がある場合はbotoログを参照)。

ありがとう、
マキシム。

答えて

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) 
をやってしまいました
0
  1. 代わりにpopenののos.chdirのだと思う(「ディレクトリ」)(「CDディレクトリ」)

  2. 多分それは、各コマンドの新しいシェルを実行するためにここにいないのが最善です:ちょうど1つのマルチを書きますpopenの(Dを経由して実行 ""

    エンド;ラインシェルは

deploy_commands = "" "バットブーイングapt-getをfooの apt-getのバー CDのバズ" をskript eploy_commands、shell = True)。

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

関連する問題