Ho avuto un problema con uno script di shell che doveva essere eseguito ogni 30 minuti su cron su un server Redhat 6. Lo script di shell è fondamentalmente solo un comando per eseguire uno script python.scl enable python27 bash
La versione nativa python sul server è 2.6.6 ma la versione python richiesta da questo particolare script è python 2.7+. Sono in grado di eseguire facilmente questo sulla riga di comando utilizzando il comando "SCL" (questo esempio include il pitone -V comando per visualizzare il cambiamento di versione):
$ python -V
Python 2.6.6
$ scl enable python27 bash
$ python -V
Python 2.7.3
A questo punto posso correre il pitone 2.7 .3 script sulla riga di comando nessun problema.
Ecco l'intoppo.
Quando si invia il comando scl enable python27 bash
, viene avviata una nuova sessione di shell bash che (ancora) va bene per il lavoro di comando interattivo. Ma quando si fa questo all'interno di uno script di shell, non appena viene eseguito il comando bash, lo script termina a causa della nuova sessione.
Ecco lo script di shell che sta fallendo:
#!/bin/bash
cd /var/www/python/scripts/
scl enable python27 bash
python runAllUpserts.py >/dev/null 2>&1
semplicemente ferma non appena colpisce la linea 4, perché "bash" salta fuori dalla sceneggiatura e in una shell bash fresca. Quindi non vede mai l'effettivo comando python di cui ho bisogno per funzionare.
Inoltre, se eseguito ogni 30 minuti, questo aggiungerebbe una nuova bash ogni volta che è un altro problema.
Sono riluttante ad aggiornare la versione nativa di Python sul server alla 2.7.3 in questo momento per diversi motivi. I repository Redhat yum non hanno ancora python 2.7.3 e un'installazione manuale sarebbe al di fuori del sistema di aggiornamento yum. Da quello che ho capito, yum stesso gira su Python 2.6.x.
Ecco dove ho trovato il metodo per l'utilizzo SCL
Spiega il codice –