在Redhat 6服务器上的cron中,我遇到了一个每隔30分钟运行一次的shell脚本。shell脚本基本上只是一个运行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此时,我可以在命令行上运行python2.7.3脚本,没有问题。
问题来了。
当您发出scl enable python27 bash命令时,它将启动一个新的bash shell会话,这个会话(同样)对于交互式命令行工作来说是很好的。但是,当在shell脚本中执行此操作时,只要运行bash命令,脚本就会因为新会话而退出。
下面是失败的shell脚本:
#!/bin/bash
cd /var/www/python/scripts/
scl enable python27 bash
python runAllUpserts.py >/dev/null 2>&1只要它到达第4行,它就会立即停止,因为" bash“会将它从脚本中弹出,并进入一个新的bash shell。所以它永远看不到我需要它运行的实际python命令。
另外,如果每30分钟运行一次,每次都会添加一个新的bash,这是另一个问题。
由于几个原因,我现在不愿意在服务器上将原生python版本更新到2.7.3。Redhat yum repos还没有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/
发布于 2013-07-02 17:07:08
在SCL环境中在一个文档中做所有事情是最好的选择,IMO:
scl enable python27 - << \EOF
cd /var/www/python/scripts/
python runAllUpserts.py >/dev/null 2>&1
EOF另一种方法是在scl环境中直接运行第二个命令(这是唯一使用Python的命令):
cd /var/www/python/scripts/
scl enable python27 "python runAllUpserts.py >/dev/null 2>&1"发布于 2015-05-21 14:10:16
scl enable python27 bash激活了一个python虚拟环境。
您可以在bash脚本中执行此操作,只需获取虚拟环境的启用脚本,即SCL包的启用脚本,该脚本位于/opt/rh/python27/enable
示例:
#!/bin/bash
cd /var/www/python/scripts/
source /opt/rh/python27/enable
python runAllUpserts.py >/dev/null 2>&1发布于 2013-10-27 02:47:46
直接使用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设置为可执行文件。
另一种选择是调用调用python的shell脚本。test_python.sh
#/bin/bash
python test_python.py在您的crontab中:
2 * * * * scl python27 enable $HOME/test_python.shhttps://stackoverflow.com/questions/16631461
复制相似问题