2013-09-25 3 views
3

У меня есть небольшой скрипт в bash, который автоматизирует установку нескольких пакетов. Он устанавливает несколько пакетов, используя apt-get, а остальные - из источников. У меня есть все источники, которые мне нужны, в один tar-файл. Пример сценария выглядит следующим образом:apt-get не работает должным образом в сценарии bash

#!/bin/bash 

apt-get install wget gcc g++ ruby php5 php5-dev xz-utils bzip2 -y 

cd /usr/local/bin/ 
wget my-sources.tar.gz 
tar zxvf my-sources.tar.gz 
cd my-sources 

tar zxvf package1.tar.gz 
cd package1 
./configure && make && make install 

cd /usr/local/src/my-sources 
tar zxvf package2.tar.gz 
cd package2 
./configure && make && make install 

cd /usr/local/src/my-sources 
tar zxvf package3.tar.gz 
cd package3 
./configure && make && make install 

echo -e "\nFinished\n" 

Этот сценарий затем кодируется с помощью zlib в Python 2.7:

import tempfile 
import subprocess 
import zlib 

with open("/usr/local/src/sample.sh") as inputfile: 
    teststr = zlib.compress(inputfile.read()).encode('base64') 
    print teststr 

Это затем передается в сценарий питона, который выполняет его следующим образом:

thisstr = "Gu11nX1eVdeGlaMoouIyJtOV/cPBWrp1b7OeY7P7GXtzb 
x7HETWRhTHC6NzM3k0nH6dw8uFs+qRtkJWiPrBGs1mlXWJjt7ZSUHe0 
ZougLFsrAmxs3b+l+q9UKFrL1aAt0glTEo8bUuSO7Gjfe3JaYpedEgt 
qkbZtz825OWUlyiz+pMPmkOdlhYu2ia+at+ZJIGZRkFzsBIqJKNhAQ4 
LlBdMzdGu593UzCBtsspZiVntsFlzbyefpjCBk+PDKbyefOZMPy9Xd/ 
wL3ieojA==" 
str=zlib.decompress(thisstr.decode('base64')) 

with tempfile.NamedTemporaryFile() as scriptfile: 
    scriptfile.write(str) 
    scriptfile.flush() 
    subprocess.call(['/bin/bash', scriptfile.name]) 

Выполняется, пока apt-get не используется, а вот wget. Поскольку wget еще не установлен, команда wget завершается с ошибкой, а затем выполнение переходит к этапам компиляции и построения (которые вызывают ошибки, поскольку файлы недоступны). Все это время, apt-get все еще выполняется.

Я попробовал 2 шага, чтобы избежать этого:

  • Добавлено sleep 5 в конце команды apt-get. Это не помогло .
  • Положите apt-get в другую функцию и вызвали функцию только
    перед командой wget.

это тоже не помогло.

Конечно, когда я запускаю его во второй раз, пакеты устанавливаются (потому что все пакеты, которые будут установлены с помощью apt-get, уже есть).

Это был протестирован и для Debian 6/Debian 7

Как я могу исправить эту ошибку?

+0

Вы пытались поставить 'wait' после' apt-get'? – lifesaspanner

+0

@lifesaspanner - Нет, я не знал о таком варианте. Не могли бы вы дать синтаксис 'wait', чтобы я мог попробовать? – rahuL

+0

Это просто 'wait'. Просто введите его в строке после 'apt-get'. Посмотрите на 'man wait' для справки. – lifesaspanner

ответ

1

Я пробовал этот рабочий процесс со своим собственным скриптом, и все работает отлично для меня, хотя декодирование/декомпрессия строки, которую вы предоставляете, завершается с помощью binascii.Error: Incorrect padding.

Единственные предложения, которые я могу сделать это:

  1. Put и r перед строкой, чтобы сделать его сырым формат - кодирование в формате base64 может создать управляющие последовательности (хотя это не является проблемой для строки вы предоставили).
  2. Распечатайте строчную переменную str - это соответствует оригинальному скрипту? Если в конце строки apt-get был &, это создало бы поведение, которое вы описываете.
  3. Найдите то, что происходит при попытке вызова с оригинальным сценарием т.е.

    subprocess.call(['/bin/bash', '/usr/local/src/sample.sh'])

    Если это производит такое же поведение, проверить, если это все еще происходит запуск скрипта непосредственно из Баша.Это может быть какая-то странность, которую вводит python или какая-то проблема с конфигурацией bash/apt, которая заставляет вещи заходить в фоновый режим (хотя я не знаю ни одного варианта, который мог бы это сделать, и я знаю оба достаточно хорошо).

Смежные вопросы