Redhat 6 サーバーの cron で 30 分ごとに実行するシェル スクリプトで問題が発生しました。シェル スクリプトは基本的に、Python スクリプトを実行するための単なるコマンドです。
サーバー上のネイティブ バージョンの python は 2.6.6 ですが、この特定のスクリプトに必要な python バージョンは python 2.7+ です。「scl」コマンドを使用して、コマンド ラインでこれを簡単に実行できます (この例には、バージョンの変更を表示するための python -V コマンドが含まれています)。
$ python -V
Python 2.6.6
$ scl enable python27 bash
$ python -V
Python 2.7.3
この時点で、コマンド ラインで python 2.7.3 スクリプトを問題なく実行できます。
これが問題です。
コマンドを発行するscl enable python27 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 リポジトリにはまだ python 2.7.3 がなく、手動インストールは yum 更新システムの外部になります。私が理解していることから、yum自体はpython 2.6.xで動作します。
これがsclを使用する方法を見つけた場所です