scl habilitar python27 bash
cron software-collections (5)
¿No es lo más fácil para tu script de python directamente? test_python.py
:
#!/usr/bin/env python
import sys
f = open(''/tmp/pytest.log'',''w+'')
f.write(sys.version)
f.write(''/n'')
f.close()
entonces en tu crontab:
2 * * * * scl python27 enable $HOME/test_python.py
Asegúrate de hacer test_python.py
ejecutable.
Otra alternativa es llamar a un script de shell que llame a python. test_python.sh
:
#/bin/bash
python test_python.py
en tu crontab:
2 * * * * scl python27 enable $HOME/test_python.sh
He encontrado un problema con un script de shell destinado a ejecutarse cada 30 minutos en cron en un servidor Redhat 6. El script de shell es básicamente un comando para ejecutar un script de python.
La versión nativa de python en el servidor es 2.6.6 pero la versión de python requerida por este script en particular es python 2.7+. Puedo ejecutar esto fácilmente en la línea de comandos usando el comando "scl" (este ejemplo incluye el comando python -V para mostrar el cambio de versión):
$ python -V
Python 2.6.6
$ scl enable python27 bash
$ python -V
Python 2.7.3
En este punto, puedo ejecutar los scripts de Python 2.7.3 en la línea de comandos, no hay problema.
Aquí está la pega.
Cuando se emite el scl enable python27 bash
se inicia una nueva sesión de shell bash que (de nuevo) está bien para el trabajo de la línea de comandos interactiva. Pero al hacer esto dentro de un script de shell, tan pronto como se ejecuta el comando bash, el script se cierra debido a la nueva sesión.
Aquí está el script de shell que está fallando:
#!/bin/bash
cd /var/www/python/scripts/
scl enable python27 bash
python runAllUpserts.py >/dev/null 2>&1
Simplemente se detiene tan pronto como llega a la línea 4 porque "bash" lo saca del script y lo introduce en una nueva shell de bash. Así que nunca ve el comando de python real, lo necesito para ejecutarlo.
Además, si se ejecuta cada 30 minutos, esto agregaría un nuevo golpe cada vez que es otro problema.
Estoy reacio a actualizar la versión nativa de python en el servidor a 2.7.3 en este momento debido a varias razones. Los repositorios de Redhat yum aún no tienen Python 2.7.3 y una instalación manual estaría fuera del sistema de actualización de yum. Por lo que entiendo, yum se ejecuta en python 2.6.x.
Aquí es donde encontré el método para usar scl
Hacer todo de una manera heredada en el entorno de SCL es la mejor opción, OMI:
scl enable python27 - << /EOF
cd /var/www/python/scripts/
python runAllUpserts.py >/dev/null 2>&1
EOF
Otra forma es ejecutar el segundo comando (que es el único que usa Python) directamente en el entorno scl:
cd /var/www/python/scripts/
scl enable python27 "python runAllUpserts.py >/dev/null 2>&1"
Solo he visto estas cosas scl
una vez antes y no tengo acceso listo a un sistema con él instalado. Pero creo que solo está configurando PATH y algunas otras variables de entorno de alguna manera que es vagamente similar a la forma en que se realizan bajo virtualenv
.
Tal vez el cambio de la secuencia de comandos para hacer que el subproceso bash
llame a python
funcionaría:
#!/bin/bash
cd /var/www/python/scripts/
(scl enable python27 bash -c "python runAllUpserts.py") >/dev/null 2>&1
La instancia de python
encuentra en el shell de bash
del subproceso debe ser su copia 2.7.x ... y todas las demás configuraciones ambientales realizadas por scl
deben heredarse de este modo.
Un trazador de líneas
scl enable python27 ''python runAllUpserts.py >/dev/null 2>&1''
Lo uso también con los devtoolsets en 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 enable python27 bash
activa un entorno virtual de python.
Puede hacerlo desde un script bash simplemente obteniendo el script enable del entorno virtual, del paquete SCL, que se encuentra en /opt/rh/python27/enable
Ejemplo:
#!/bin/bash
cd /var/www/python/scripts/
source /opt/rh/python27/enable
python runAllUpserts.py >/dev/null 2>&1