Поддержание состояния среды между подпроцессами. Открыть команды? - PullRequest
0 голосов
/ 20 декабря 2010

Я пишу механизм развертывания для нашей системы, где каждый проект определяет свои собственные инструкции по развертыванию.

Узлы работают на EC2.

Один из проектов зависит от исходной версии стороннего приложения.

В частности:

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

В настоящее время я делаю это с ShellCommand boto (который использует 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 относится к подпроцессу, что означает, что как только я возвращаю отцовский процесс и запускаю вторую ShellCommand, exeenv наследуется от отцовского, что заставляет меня думать, что мне нужна какая-то среда выполнения Команды оболочки, которые будут применять все команды в одном подпроцессе без потери контекста.

Каково рекомендуемое решение этой проблемы? Обратите внимание, что регистрация приложения, запущенного из командной строки, очень важна (как вы можете отлаживать без него?), Поэтому мне нравится ShellCommand ... (см. Logto logging, если интересно).

Спасибо,
Максим.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Я закончил этим

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 голосов
/ 20 декабря 2010
  1. Подумайте о os.chdir ("DIRECTORY") вместо Popen ("CD DIRECTORY")

  2. Возможно, здесь лучше не запускать новую оболочкудля каждой команды: просто напишите один многострочный сценарий оболочки

deploy_commands = "" "apt-get foo apt-get bar cd baz; boo bat" ""

end выполнить через Popen (deploy_commands, shell = True).

Но, пожалуйста, ознакомьтесь с предупреждением безопасности в документации Popen о том, что нельзя избежать ненадежных параметров.

...