Я попал в ловушку с оболочкой 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