scl включить python27 bash

Я столкнулся с загадкой сценария оболочки, предназначенного для запуска каждые 30 минут в cron на сервере Redhat 6. Сценарий оболочки - это просто команда для запуска скрипта на Python.

Собственная версия python на сервере - 2.6.6, но для этого конкретного скрипта требуется версия 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, что (опять же) хорошо для интерактивной командной строки. Но при выполнении этого внутри сценария оболочки, как только он запускает команду bash, сценарий завершается из-за нового сеанса.

Вот сценарий оболочки, который терпит неудачу:

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

Он просто останавливается, как только попадает в строку 4, потому что "bash" выталкивает его из скрипта в новую оболочку 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/

5 ответов

Выполнение всего в одном 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"

scl enable python27 bash активирует виртуальную среду Python.

Вы можете сделать это из скрипта bash, просто используя скрипт включения виртуальной среды пакета SCL, который находится по адресу /opt/rh/python27/enable

Пример:

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

Разве не проще всего просто напрямую написать скрипт на python? 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 исполняемый файл.

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

#/bin/bash
python test_python.py

в вашем crontab:

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

Один лайнер

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

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

me@my_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.

scl это самая тупая ерунда "давайте попробуем запереть вас", которую я когда-то видел.

Вот как я это сделал, чтобы передать аргументы серии скриптов, которые все связаны с одним файлом скелета:

$ cat /usr/bin/skeleton
#!/bin/sh

tmp="$( mktemp )"
me="$( basename $0 )"
echo 'scl enable python27 - << \EOF' >> "${tmp}"
echo "python '/opt/rh/python27/root/usr/bin/${me}' $@" >> "${tmp}"
echo "EOF" >> "${tmp}"
sh "${tmp}"
rm "${tmp}"

Итак, если есть сценарий, который вы хотите запустить, который живет, скажем, /opt/rh/python27/root/usr/bin/pepper ты можешь это сделать:

# cd /usr/bin
# ln -s skeleton pepper
# pepper foo bar

и он должен работать, как ожидалось.

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

Возможно, изменение сценария, чтобы иметь 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 должно быть унаследовано.

Другие вопросы по тегам