Bạn có thể chạy cùng một tập lệnh python hai lần không?

Jeff McNeil

2007-06-18 20. 57. 02 UTC

liên kết cố định

Tôi có một công việc xử lý nhật ký khá lớn ở đây có cùng
yêu cầu. Tôi xử lý và sắp xếp nhật ký Apache từ cụm 8 chiều. Tôi
sắp xếp và tính toán số liệu thống kê trong các công việc hàng loạt kéo dài 15 phút. Chỉ một bản sao
được chạy cùng một lúc.

Tôi mở một tệp và khóa nó bằng cách như thế này.

nhập fcntl

fhandle = file["ourlockfile. txt", "w"]

hãy thử.
fcntl. lockf[fhandle. fileno[], fcntl. LOCK_EX. fcntl. LOCK_NB]
ngoại trừ IOError, e.
nếu e. sai == sai. LẠI.
in >>sys. stderr, "đang thoát, một bản sao khác hiện đang chạy"
else.
nâng cao

Tôi đã gói nó trong một lớp 'FileBasedLock', giống như các đối tượng Lock
trong mô-đun luồng.

Nếu hệ thống đánh bom và khởi động lại, ổ khóa sẽ bị xóa. Nếu
tiến trình đầu tiên chết do 'kill -XX', các khóa mà tiến trình đó sở hữu sẽ được giải phóng. Tất
tất nhiên, những tác động bên ngoài có thể làm hỏng tất cả, nhưng điều đó không
quá đáng lo ngại trong môi trường của chúng ta.

Mặc dù tôi không biết tính năng này di động đến mức nào, nhưng nó hoạt động rất tốt cho những gì tôi
đang làm trên RHES 5.

-Jeff

Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi
tập lệnh kết thúc.
mở['khóa. txt','w']
my_script[]
#print script đang chạy

Điều đó chỉ hoạt động dưới cửa sổ

f=open['lock. txt','w']
g=open['khóa. txt','w']
f. write['hi']
g. write['ho']
f. close[]
g. đóng[]
mở['khóa. txt']. đọc[]

'ho'
The best cross platform way to create a lock is creating a directory.
It is atomic on both windows and linux anyway.
os.mkdir["lock"]
print "locked!"
do_stuff[]
os.rmdir["lock"]
[untested]

Là người chỉ biết đến cửa sổ, tôi không biết điều đó. ]
Thực ra tôi nghĩ là có, chủ đề này đã xảy ra trước đây - một vài tháng trước. ]
Tôi sẽ lo lắng với tùy chọn tồn tại thư mục vì cùng
lý do hiện tại tôi không sử dụng phương thức tồn tại tệp. Có thể
thư mục tồn tại khi tập lệnh không chạy, do đó
ngăn tập lệnh chạy lại cho đến khi ai đó thông báo.
Trên Windows, phương pháp mở tệp để ghi hoạt động tốt, nhưng vì *nix
không hoạt động theo cách tương tự nên có thể giải pháp ổ cắm . Ổ cắm không thể tồn tại khi tập lệnh không
cross-platform option. The socket can't exist when the script isn't
chạy và nếu bạn thử tạo một ổ cắm trùng lặp, bạn sẽ bắt gặp ngoại lệ
và thoát.
Tất nhiên là IMHO.
. ]
--
http. //email. con trăn. org/mailman/listinfo/python-list

Jeff McNeil

2007-06-18 20. 58. 31 UTC

liên kết cố định

Lưu ý rằng trong thực tế, tập lệnh sẽ thoát hoàn toàn nếu một bản sao khác đang chạy.

Tôi có một công việc xử lý nhật ký khá lớn ở đây có yêu cầu tương tự
. Tôi xử lý và sắp xếp nhật ký Apache từ cụm 8 chiều. Tôi
sắp xếp và tính toán số liệu thống kê trong các công việc hàng loạt kéo dài 15 phút. Chỉ một bản sao
được chạy cùng một lúc.
nhập fcntl
fhandle = file["ourlockfile. txt", "w"]
fcntl. lockf[fhandle. fileno[], fcntl. LOCK_EX. fcntl. LOCK_NB]
in >>sys. stderr, "đang thoát, một bản sao khác hiện đang chạy"
nâng cao
Tôi đã gói nó trong lớp 'FileBasedLock' giống như Khóa
objects in the threading module.
Nếu hệ thống đánh bom và khởi động lại, ổ khóa sẽ bị xóa. Nếu
tiến trình đầu tiên chết do 'kill -XX', các khóa mà tiến trình đó sở hữu sẽ được giải phóng. Tất nhiên
những tác động bên ngoài có thể làm hỏng tất cả, nhưng điều đó không
quá đáng lo ngại trong môi trường của chúng ta.
Mặc dù tôi không biết tính năng này di động đến mức nào, nhưng nó hoạt động rất tốt cho những gì tôi
đang làm trên RHES 5.
-Jeff

Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi
tập lệnh kết thúc.
mở['khóa. txt','w']
my_script[]
#print script đang chạy

Điều đó chỉ hoạt động dưới cửa sổ

f=open['lock. txt','w']
g=open['khóa. txt','w']
f. write['hi']
g. write['ho']
f. close[]
g. đóng[]
mở['khóa. txt']. đọc[]

'ho'
The best cross platform way to create a lock is creating a directory.
It is atomic on both windows and linux anyway.
os.mkdir["lock"]
print "locked!"
do_stuff[]
os.rmdir["lock"]
[untested]

Là người chỉ biết đến cửa sổ, tôi không biết điều đó. ]
Thực ra tôi nghĩ là có, chủ đề này đã xảy ra trước đây - một vài tháng trước. ]
Tôi sẽ lo lắng với tùy chọn tồn tại thư mục vì cùng
lý do hiện tại tôi không sử dụng phương thức tồn tại tệp. Có thể
thư mục tồn tại khi tập lệnh không chạy, do đó
ngăn tập lệnh chạy lại cho đến khi ai đó thông báo.
Trên Windows, phương pháp mở tệp để ghi hoạt động tốt, nhưng vì *nix
không hoạt động theo cách tương tự nên có thể giải pháp ổ cắm . Ổ cắm không thể tồn tại khi tập lệnh không
cross-platform option. The socket can't exist when the script isn't
chạy và nếu bạn thử tạo một ổ cắm trùng lặp, bạn sẽ bắt gặp ngoại lệ
và thoát.
Tất nhiên là IMHO.
. ]
--
http. //email. con trăn. org/mailman/listinfo/python-list

Tim Williams

2007-06-18 17. 17. 40 UTC

liên kết cố định

Tôi muốn ngăn tập lệnh python chạy hai lần; .
can take too long.
Kịch bản đơn giản của tôi có vẻ như
.
fn = 'MARKER'
log['%s. công việc hàng giờ đang chạy rồi' % formatTime[]]
f = open[fn,'w']
f. viết [str [os. getpid[]]]
f. close[]
work[]
os. remove[fn]
main[]
nhưng tôi chợt nghĩ rằng mình có thể bị giết vì thành kiến ​​trong suốt thời gian dài
chạy . Có cách nào thông minh để tránh chạy đồng thời không.

Một phương pháp khác mà bạn có thể sử dụng là mở một ổ cắm trên
cổng được xác định trước [có lẽ là trên 1024], sau đó cài đặt chương trình của bạn
. ].
determine whether or not to run [or whether to do some of the
remaining work, etc.].

Bạn không cần nói chuyện với ổ cắm, tập lệnh thứ hai đang cố tạo
ổ cắm thứ hai trên cùng một số sẽ đưa ra một ngoại lệ và bạn có thể
exit the script cleanly without running a second copy.

Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi
tập lệnh kết thúc.

hãy thử.
mở['khóa. txt','w']
my_script[]
ngoại trừ.
#print tập lệnh đang chạy

Nếu tệp đã được mở thì tập lệnh sẽ không chạy, nếu tập lệnh
kết thúc .


Trong cả hai trường hợp, nếu tập lệnh kết thúc bình thường hoặc gặp sự cố hoặc
máy khởi động lại. Khóa [tức là ổ cắm hoặc tệp đang mở] được giải phóng.

HTH. ]

--
Tim Williams

Evan Klitzke

2007-06-18 17. 44. 48 UTC

liên kết cố định

Bài đăng của Tim Williams

Tôi muốn ngăn tập lệnh python chạy hai lần; .
can take too long.
Kịch bản đơn giản của tôi có vẻ như
.
fn = 'MARKER'
log['%s. công việc hàng giờ đang chạy rồi' % formatTime[]]
f = open[fn,'w']
f. viết [str [os. getpid[]]]
f. close[]
work[]
os. remove[fn]
main[]
nhưng tôi chợt nghĩ rằng mình có thể bị giết vì thành kiến ​​trong suốt thời gian dài
chạy . Có cách nào thông minh để tránh chạy đồng thời không.

Một phương pháp khác mà bạn có thể sử dụng là mở một ổ cắm trên
cổng được xác định trước [có lẽ là trên 1024], sau đó cài đặt chương trình của bạn
. ].
determine whether or not to run [or whether to do some of the
remaining work, etc.].

You don't need to talk to the socket, a second script trying to create
a second socket on the same number will throw an exception and you can
exit the script cleanly without running a second copy.

Chỉ cần cố gắng liên kết với cổng là điều đơn giản nhất cần làm nếu tất cả những gì bạn
muốn làm là kiểm tra xem phiên bản khác của tập lệnh có đang chạy hay không
because as Tim pointed out, you cannot bind to a port that another
program is using. But there's also an advantage to spending the time
để thực sự thiết lập một số loại giao thức liên lạc bằng cách sử dụng cổng
vì hai lý do. 1] nếu một chương trình khác liên kết với cổng, bạn sẽ
có thể phát hiện ra điều này và 2] có thể thuận lợi khi chia công việc
giữa hai . Ví dụ:
the processes by having them communicate over the socket. For example,
có thể xảy ra trường hợp quy trình đầu tiên có thể báo cho phiên bản thứ hai
của tập lệnh "Tôi sắp hoàn thành, nếu bạn muốn trợ giúp . "
this part of the remaining problem."

--
Evan Klitzke

Tim Williams

2007-06-18 19. 07. 06 UTC

liên kết cố định

.........

Bài đăng của Wildemar Wildenburger
Tôi có thể nghĩ ra một cách ngớ ngẩn. tạo một tệp tạm thời trong
giao dịch và yêu cầu tập lệnh của bạn kiểm tra tệp đó trước khi chạy phần thân
chính của nó.
Tôi nghĩ đó là cách làm không rắc rối nhất.
/W

I looked at the temporary files idea, but I'm not certain about the exact
details. Normally your create a file and then remove it whilst keeping the file
handle; that allows your program to write to it whilst guaranteeing that it will
vanish when you die, but this has to be a named file so that the second instance
can check for it.

Điều đó có ngăn nó bị xóa không? .

experience is long, but fairly primitive.

You don't need to remove the file, write anything to it, or check for
prior existance :]

If one process has the file open for writing, no other process can
open it for writing at the same time - and this is what you are
checking for! The exception that the second concurrent open/write
attempt raises tells you that another instance of the script is
running.

This has the added advantage that should something go wrong, such as
an abnormal termination or reboot, the open/write disappears and the
next time the script runs everything is back to normal.

HTH :]

Chủ Đề