2013-05-19 8 views
14

私は、RedHat 6サーバー上のcronで30分ごとに実行するためのシェルスクリプトを使用していました。シェルスクリプトは、基本的にPythonスクリプトを実行するコマンドです。scl enable python27 bash

サーバー上のネイティブバージョンのPythonは2.6.6ですが、この特定のスクリプトで必要なPythonバージョンはPython 2.7+です。私のpython 2.7を実行することができます。この時点で

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

:私は簡単に「SCL」コマンドを(この例では、バージョンの変更を表示するコマンド-Vのpythonを含んで)使用して、コマンドラインでこれを実行することができています.3コマンドラインのスクリプトは問題ありません。

ここでは絡み合いがあります。

scl enable python27 bashコマンドを発行すると、新しいbashシェルセッションが開始されます。新しいbashシェルセッションが開始され、対話的なコマンドライン作業が可能になります。しかし、シェルスクリプト内でこれを実行すると、bashコマンドを実行するとすぐに、新しいセッションのためにスクリプトが終了します。ここで

が失敗しているシェルスクリプトです:

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

「bashは」スクリプトの外に、新鮮なbashシェルにそれをポップので、それは単に、すぐにそれが4行目に当たると停止します。だから私はそれが実行するために必要な実際のpythonコマンドを見ることはありません。

さらに、30分ごとに実行すると、毎回新しいbashが追加されますが、これもまた別の問題です。

いくつかの理由により、サーバー上のネイティブのPythonバージョンを2.7.3に更新するのは嫌です。 Redhat yum reposはPython 2.7.3をまだ持っていません。手動インストールはyumアップデートシステムの外にあります。私が理解していることから、yum自体はPython 2.6.xで動作します。

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

もう一つの方法は、実行することです:私はIMO、SCL環境で1つのヒアドキュメントですべてをやっ

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

答えて

22

が最良の選択肢であるSCLを使用するための方法を発見したのはここ

です2番目のコマンド(これはPythonを使用する唯一のコマンドです)をscl環境で直接呼び出します:

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

あなたのpythonスクリプトに直接に最も簡単なのはありませんか? test_python.py:あなたのcrontabで、その後

#!/usr/bin/env python 

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

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

あなたはtest_python.py実行可能にしていることを確認します。

もう1つの方法は、pythonを呼び出すシェルスクリプトを呼び出す方法です。test_python.sh

#/bin/bash 
python test_python.py 

あなたのcrontabで:

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

は、私は一度だけ前にこのsclものを見てきたし、それがインストールされたシステムへの容易なアクセスを持っていません。しかし、私はそれがちょうどvirtualenvの下で行われている方法と曖昧に何らかの形でPATHといくつかの他の環境変数を設定していると思います。シェルは、あなたの2.7.35コピーする必要がありますのbash

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

サブプロセスで見つかったpythonのインスタンスを...とすべて:

はおそらくbashサブプロセスの呼び出しpythonがうまくいく持つようにスクリプトを変更しますsclによって行われる他の環境設定を継承する必要があります。

7

source /opt/rh/python27/enable必要に応じて。

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

にdevtoolsetsでもそれを使用します –

2

ワンライナー

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

私はあなたのコードを説明するの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.