Scl enable python27 bash - программирование
Подтвердить что ты не робот

Scl enable python27 bash

Я попал в ловушку с оболочкой script, предназначенной для запуска каждые 30 минут в cron на сервере Redhat 6. Оболочка script - это просто команда запуска python script.

Собственная версия python на сервере - 2.6.6, но версия python, требуемая этим конкретным script, - это python 2.7+. Я могу легко запустить это в командной строке с помощью команды "scl" (этот пример включает в себя команду python -V, чтобы показать изменение версии):

$ python -V
Python 2.6.6
$ scl enable python27 bash
$ python -V
Python 2.7.3

В этот момент я могу запустить скрипты python 2.7.3 в командной строке без проблем.

Здесь есть загвоздка.

Когда вы выдаете команду scl enable python27 bash, запускается новый сеанс оболочки bash, который (снова) отлично подходит для интерактивной работы с командной строкой. Но когда вы делаете это внутри оболочки script, как только она запускает команду bash, script завершается из-за нового сеанса.

Здесь находится оболочка script:

#!/bin/bash
cd /var/www/python/scripts/
scl enable python27 bash
python runAllUpserts.py >/dev/null 2>&1

Он просто останавливается, как только он попадает в строку 4, потому что "bash" выталкивает его из script и в новую оболочку bash. Поэтому он никогда не видит фактическую команду python, которая мне нужна для ее запуска.

Кроме того, если вы запускаете каждые 30 минут, это добавляет новый bash каждый раз, что является еще одной проблемой.

Я не хочу обновлять версию родного python на сервере до 2.7.3 прямо сейчас из-за нескольких причин. В репозиториях Redhat yum еще нет python 2.7.3, и ручная установка будет за пределами системы обновления yum. Из того, что я понимаю, сам yum работает на python 2.6.x.

Здесь, где я нашел метод для использования scl

http://developerblog.redhat.com/2013/02/14/setting-up-django-and-python-2-7-on-red-hat-enterprise-6-the-easy-way/

4b9b3361

Ответ 1

Выполнение всего в одном heredoc в среде SCL - лучший вариант, IMO:

scl enable python27 - << \EOF
cd /var/www/python/scripts/
python runAllUpserts.py >/dev/null 2>&1
EOF

Другой способ - запустить только вторую команду (которая является единственной, которая использует Python) в среде scl напрямую:

cd /var/www/python/scripts/
scl enable python27 "python runAllUpserts.py >/dev/null 2>&1"

Ответ 2

Не самый простой для вашего python script? test_python.py:

#!/usr/bin/env python

import sys
f = open('/tmp/pytest.log','w+')
f.write(sys.version)
f.write('\n')
f.close()

то в вашем crontab:

2 * * * *    scl python27 enable $HOME/test_python.py

Убедитесь, что вы выполнили test_python.py.

Другой альтернативой является вызов оболочки script, которая вызывает питон. test_python.sh:

#/bin/bash
python test_python.py

в вашем crontab:

2 * * * *   scl python27 enable $HOME/test_python.sh

Ответ 3

source /opt/rh/python27/enable при необходимости.

#!/bin/bash
cd /var/www/python/scripts/
source /opt/rh/python27/enable
python runAllUpserts.py >/dev/null 2>&1

Ответ 4

Один вкладыш

scl enable python27 'python runAllUpserts.py >/dev/null 2>&1'

Я использую его также с devtoolsets на CentOS 6.x

[email protected]_host:~/tmp# scl enable devtoolset-1.1 'gcc --version'
gcc (GCC) 4.7.2 20121015 (Red Hat 4.7.2-5)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ответ 5

Я видел этот материал scl только один раз раньше и не имею готового доступа к системе с установленной программой. Но я думаю, что он просто настраивает PATH и некоторые другие переменные среды в некотором роде, которые смутно похожи на то, как они выполняются под virtualenv.

Возможно, изменение script для использования bash подпроцесса python:

#!/bin/bash
cd /var/www/python/scripts/
(scl enable python27 bash -c "python runAllUpserts.py") >/dev/null 2>&1

Экземпляр python, найденный в оболочке подпроцесса bash, должен быть вашей копией 2.7.x... и все остальные настройки среды, сделанные scl, должны быть унаследованы.