2013-05-19 6 views
14

Ich habe einen Haken mit einem Shell-Skript getroffen, die alle 30 Minuten in Cron auf einem Redhat 6-Server ausgeführt werden soll. Das Shell-Skript ist im Grunde nur ein Befehl, um ein Python-Skript auszuführen.scl aktivieren python27 bash

Die native Version Python auf dem Server ist 2.6.6, aber die Python-Version für dieses spezielle Skript ist Python 2.7 +. Ich bin in der Lage, einfach diese auf der Befehlszeile ausführen, indem Sie den „scl“ Befehl (in diesem Beispiel enthält den Python -V Zeigt die Versionsänderung zeigen Befehl):

$ python -V 
Python 2.6.6 
$ scl enable python27 bash 
$ python -V 
Python 2.7.3 

An dieser Stelle kann ich den Python läuft 2.7 .3 Skripte in der Kommandozeile kein Problem.

Hier ist der Haken.

Wenn Sie den Befehl scl enable python27 bash eingeben, wird eine neue Bash-Shell-Sitzung gestartet, die (wiederum) für interaktive Befehlszeilenarbeit geeignet ist. Wenn dies jedoch in einem Shell-Skript ausgeführt wird, wird das Skript aufgrund der neuen Sitzung beendet, sobald es den Befehl bash ausführt.

Hier ist der Shell-Skript, die fehlschlägt:

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

Es einfach stoppt, sobald es Linie 4 trifft, weil „bash“ erscheint es aus dem Skript und in einen frisch Bash-Shell. Es sieht also nie den eigentlichen Python-Befehl, den ich ausführen muss.

Plus, wenn alle 30 Minuten ausgeführt würde dies eine neue bash jedes Mal hinzufügen, die ein weiteres Problem ist.

Ich bin aus mehreren Gründen derzeit nicht bereit, die native Python-Version auf dem Server auf 2.7.3 zu aktualisieren. Die Redhat-yum-Repos haben noch nicht python 2.7.3 und eine manuelle Installation wäre außerhalb des yum-update-Systems. Soweit ich weiß, läuft yum selbst auf Python 2.6.x.

Hier ist, wo ich die Methode gefunden scl

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

Antwort

22

tun alles in einem heredoc in der SCL-Umgebung für die Verwendung ist die beste Option, IMO:

scl enable python27 - << \EOF 
cd /var/www/python/scripts/ 
python runAllUpserts.py >/dev/null 2>&1 
EOF 

Ein anderer Weg zu laufen ist nur der zweite Befehl (welcher der einzige ist, der Python verwendet) in der scl-Umgebung direkt:

cd /var/www/python/scripts/ 
scl enable python27 "python runAllUpserts.py >/dev/null 2>&1" 
6

Ist das Python-Skript nicht einfach am einfachsten? test_python.py:

#!/usr/bin/env python 

import sys 
f = open('/tmp/pytest.log','w+') 
f.write(sys.version) 
f.write('\n') 
f.close() 

dann in crontab:

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

Stellen Sie sicher, test_python.py ausführbar zu machen.

Eine andere Alternative ist das Aufrufen eines Shell-Skripts, das den Python aufruft.test_python.sh:

#/bin/bash 
python test_python.py 

in crontab:

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

Ich habe nur einmal diese scl Sachen gesehen und haben nicht bereit Zugriff auf ein System mit installiert. Aber ich denke, es ist nur PATH und einige andere Umgebungsvariablen in irgendeiner Weise, die vage ähnlich wie sie unter virtualenv getan werden.

Vielleicht das Skript Ändern der bash subprocess Aufruf haben python funktionieren würde:

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

Die Instanz von python auf der subprocess bash ‚s Schale sollte Ihr 2.7.x kopieren sein gefunden ... und alle andere durch scl vorgenommene Umgebungseinstellungen sollten dabei vererbt werden.

7

source /opt/rh/python27/enable bei Bedarf.

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

Code Erklären –

2

One-Liner

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

Ich benutze es auch mit dem devtoolsets auf dem CentOS-6.x

[email protected]_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.