29

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を使用する方法を見つけた場所です

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

4

6 に答える 6

29

SCL環境で1つのヒアドキュメントですべてを行うのが最良のオプションです.IMO:

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

もう 1 つの方法は、2 番目のコマンド (Python を使用する唯一のコマンド) を scl 環境で直接実行することです。

cd /var/www/python/scripts/
scl enable python27 "python runAllUpserts.py >/dev/null 2>&1"
于 2013-07-02T09:07:07.877 に答える
23

scl enable python27 bashPython 仮想環境をアクティブにします。

これは、次の場所にある SCL パッケージの仮想環境の有効化スクリプトをソースするだけで、bash スクリプト内から実行できます。/opt/rh/python27/enable

例:

#!/bin/bash
cd /var/www/python/scripts/
source /opt/rh/python27/enable
python runAllUpserts.py >/dev/null 2>&1
于 2015-05-21T06:10:16.040 に答える
8

Pythonスクリプトを直接実行するのが最も簡単ではありませんか? test_python.py:

#!/usr/bin/env python

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

次に、crontabで:

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
于 2013-10-26T18:47:45.893 に答える
1

scl「私がしばらく見た中で最もばかげている」「あなたをナンセンスに閉じ込めよう」

すべてが単一のスケルトン ファイルにリンクされている一連のスクリプトに引数を渡すことができるように、次のように作成しました。

$ cat /usr/bin/skeleton
#!/bin/sh

tmp="$( mktemp )"
me="$( basename $0 )"
echo 'scl enable python27 - << \EOF' >> "${tmp}"
echo "python '/opt/rh/python27/root/usr/bin/${me}' $@" >> "${tmp}"
echo "EOF" >> "${tmp}"
sh "${tmp}"
rm "${tmp}"

したがって、実行したいスクリプトが存在する場合、たとえば、次のように/opt/rh/python27/root/usr/bin/pepperすることができます。

# cd /usr/bin
# ln -s skeleton pepper
# pepper foo bar

期待どおりに動作するはずです。

于 2020-04-20T19:24:44.480 に答える
0

私はこれsclを一度だけ見たことがありますが、それがインストールされたシステムにアクセスする準備ができていません。しかし、それは PATH と他のいくつかの環境変数を何らかの方法で設定しているだけだと思いますvirtualenv

おそらく、bashサブプロセス呼び出しを持つようにスクリプトを変更するpythonとうまくいくでしょう:

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

pythonsubprocess の shell にある foundのインスタンスはbash、2.7.x のコピーである必要があります ... によって行われた他のすべての環境設定は、sclそれによって継承される必要があります。

于 2015-03-09T21:46:48.750 に答える