2013-05-19 18 views
14

Tôi đã nhấn một snag với một kịch bản lệnh shell nhằm chạy 30 phút một lần trong cron trên máy chủ Redhat 6. Kịch bản lệnh shell về cơ bản chỉ là một lệnh để chạy một kịch bản lệnh python.scl kích hoạt python27 bash

Phiên bản gốc python trên máy chủ là 2.6.6 nhưng phiên bản python theo yêu cầu của tập lệnh cụ thể này là python 2.7+. Tôi có thể dễ dàng chạy này trên dòng lệnh bằng cách sử dụng "SCL" lệnh (ví dụ này bao gồm trăn -V lệnh để hiển thị sự thay đổi phiên bản):

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

Tại thời điểm này tôi có thể chạy python 2.7 .3 tập lệnh trên dòng lệnh không có vấn đề gì.

Đây là thẻ.

Khi bạn phát hành lệnh scl enable python27 bash, nó bắt đầu phiên bash shell mới (một lần nữa) là tốt cho công việc dòng lệnh tương tác. Nhưng khi thực hiện điều này bên trong một kịch bản lệnh shell, ngay sau khi nó chạy lệnh bash, script sẽ thoát vì phiên mới.

Đây là shell script được không:

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

Nó chỉ đơn giản dừng lại ngay khi nó chạm dòng 4 vì "bash" bật nó ra khỏi kịch bản và vào một vỏ bash tươi. Vì vậy, nó không bao giờ nhìn thấy lệnh python thực tế tôi cần nó để chạy.

Ngoài ra, nếu chạy 30 phút một lần, điều này sẽ thêm một dấu gạch chéo mới mỗi lần là một vấn đề khác.

Tôi không muốn cập nhật phiên bản python gốc trên máy chủ lên 2.7.3 ngay bây giờ do một số lý do. Các repo Redhat yum chưa có python 2.7.3 và cài đặt bằng tay sẽ nằm ngoài hệ thống cập nhật yum. Từ những gì tôi hiểu, yum tự chạy trên python 2.6.x.

Đây là nơi tôi tìm thấy phương pháp cho việc sử dụng SCL

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

Trả lời

22

Làm tất cả mọi thứ trong một heredoc trong môi trường SCL là lựa chọn tốt nhất, IMO:

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

Một cách khác là chạy chỉ lệnh thứ hai (là lệnh duy nhất sử dụng Python) trong môi trường scl trực tiếp:

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

Không phải là cách dễ nhất để chỉ tập lệnh python của bạn trực tiếp? test_python.py:

#!/usr/bin/env python 

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

sau đó trong crontab của bạn:

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

Hãy chắc chắn rằng bạn thực hiện test_python.py thực thi.

Một lựa chọn khác là gọi một tập lệnh shell gọi là python.test_python.sh:

#/bin/bash 
python test_python.py 

trong crontab của bạn:

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

Tôi đã chỉ nhìn thấy công cụ này scl một lần trước và không có sẵn sàng tiếp cận một hệ thống với nó được cài đặt. Nhưng tôi nghĩ rằng nó chỉ là thiết lập PATH và một số biến môi trường khác theo cách nào đó tương tự như cách chúng được thực hiện dưới virtualenv.

Có lẽ thay đổi kịch bản để có cuộc gọi bash subprocess python sẽ làm việc:

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

Các thể hiện của python tìm thấy trên các tiến trình con bash của vỏ nên 2.7.x bạn sao chép ... và tất cả các các thiết lập môi trường khác được thực hiện bởi scl nên được kế thừa từ đó.

7

source /opt/rh/python27/enable nếu cần.

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

Giải thích mã của bạn –

2

Một lót

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

tôi sử dụng nó cũng với devtoolsets trên 6.x CentOS

[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. 
Các vấn đề liên quan