2012-09-01 22 views
7

Tôi có một tập lệnh python mà tôi muốn chỉ cho phép chạy một lần trên máy. Tôi muốn nó in một cái gì đó như "Lỗi, đã chạy" nếu nó đã chạy, cho dù nó đang chạy trong nền hoặc trong một phiên ssh khác nhau. Làm thế nào tôi sẽ làm điều này? Đây là kịch bản của tôi.Chỉ cho phép một phiên bản của tập lệnh python?

import urllib, urllib2, sys 
num = sys.argv[1] 
print 'Calling' 
phones = [ 
'http://phone1/index.htm', 
'http://phone2/index.htm', 
'https://phone3/index.htm', 
'https://phone4/index.htm', 
'https://phone5/index.htm' 
] 
data = urllib.urlencode({"NUMBER":num, "DIAL":"Dial", "active_line":1}) 
while 1: 
    for phone in phones: 
     try: 
      urllib2.urlopen(phone,data) # make call 
      urllib2.urlopen(phone+"?dialeddel=0") # clear logs 
     except: pass 

P.S Tôi đang sử dụng CentOS 5 nếu vấn đề đó quan trọng.

Trả lời

3
  1. Bạn có thể triển khai khóa trên tệp.
  2. Tạo tệp tạm thời khi bắt đầu thực thi và kiểm tra xem tệp đó có hiển thị trước khi chạy tập lệnh hay không.

Tham khảo bài này cho answer- Check to see if python script is running

+0

Nếu bạn đang đi để viết chỉ là một liên kết, bạn có thể muốn trích dẫn từ nó một chút là tốt. – icktoofay

+1

Cảm ơn mẹo. – fatrock92

+0

Vấn đề là, kịch bản là một vòng lặp vô hạn, do đó, nó sẽ không bao giờ có được đến cuối của kịch bản mà khóa được gỡ bỏ. –

0

Bạn có thể khóa một tập tin hiện có sử dụng ví dụ flock khi bắt đầu tập lệnh của bạn. Sau đó, nếu cùng một tập lệnh được chạy hai lần, phiên bản mới nhất bắt đầu sẽ chặn. Xem thêm this question.

+0

Vấn đề là, kịch bản là một vòng lặp vô hạn, do đó, nó sẽ không bao giờ đến cuối tập lệnh nơi khóa bị xóa. –

+0

Bạn có thể thêm một trình xử lý cho 'SIGTERM' hoặc' SIGQUIT' để xóa một fleg được sử dụng như một điều kiện vòng lặp. –

+0

Bạn có thể giải thích cho tôi cách thực hiện điều này và ý nghĩa của nó không? Vì tôi mới sử dụng python –

2

Bạn có thể cài đặt gói single với pip install single sẽ sử dụng khóa cố vấn để đảm bảo rằng chỉ một phiên bản lệnh sẽ chạy mà không để lại tệp khóa cũ.

Bạn có thể gọi nó trên kịch bản của bạn như thế này:

single.py -c long-running-script arg1 arg2 
+0

Không tìm thấy lệnh PIP. Làm thế nào tôi sẽ làm điều này trên centos? Không có gói đơn nào với yum –

+0

Bạn có thể phải làm 'sudo easy_install pip' trước. Sau đó pip sẽ tải xuống gói đơn tự động từ đây: http://pypi.python.org/pypi/single/ – aculich

+0

Sau khi cài đặt pip, sau đó thực hiện cài đặt pip đơn, tôi nhận được http://pastebin.com/6MTmHkMT –