bash cron software-collections

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

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


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