作者Rhinocero (愛火快滅了)
看板Python
標題Re: [問題] 如何讓程式同時只能跑一隻
時間Thu Jul 26 21:22:30 2012
感謝k大提供想法
本來我也想到類似apache等daemon的作法
放PID file在/var/run裡來做檢查
不過我已用os.popen來執行ps實作了
但覺得奇怪的是,直接執行運作很成功
可是放進cron裡就無法成功
節錄部份的code
有興趣的大大可以一起研究看看 ^^
#This is test.py
#!/usr/bin/env python
import os, socket, time, StringIO, commands, readline, re
check_process_cmd = '/bin/ps aux | /bin/grep python | /bin/grep test.py
(接上行) | /bin/grep -v /bin/sh | /bin/grep -v grep'
check_process = os.popen(check_process_cmd).readlines()
##上面可以找到用ps找到process python在跑的test.py
print len(check_process)
print check_process
process_log = ('%s\n,%s\n' % (len(check_process), check_process))
print process_log
check_process_file = file('/tmp/process_log.txt', 'a')
check_process_file.write(process_log)
check_process_file.close()
##上面是我為了偵測cehck_process會不會正常的run所做到log
##會印在螢幕上印出ps找到的行數和內容並寫到/tmp/process_log.txt
if len(check_process) < 1:
##如果剛剛ps找到的訊息行數小於1,才開始進行程式的主體
##到這邊在真的開始進行程式主體 (略)
else:
print('\33[1;31;40m\'test.py\' is already running now !\33[0m')
##程式結束
##若是剛剛的ps找到的訊息行數不是 <1 (已經有process了)
##則印出訊息
上面這部份直接執行都很正常
但放到cron裡只會印出:
0
,[]
並再開一隻起來跑…
※ 引述《Rhinocero (愛火快滅了)》之銘言:
: 標題: [問題] 如何讓程式同時只能跑一隻
: 時間: Thu Jul 26 03:26:32 2012
:
:
: 各位大大好
: 小的拿Python來寫程式
: 目前遇到一個問題
:
: 平台為Linux
: 因為有支程式想讓它用無限迴圈一直執行
: 定時跑出小的想要的東西
:
: 為避免程式process消失(當機 or 重開機 or kill程式…等)
: 會在cron table設定每分鐘 or 每5分鐘執行一次
:
: 所以在程式的開頭會做個檢查
: 要是已在執行,就跳出
:
: 可否請各位大大指點一下
: 用什麼方法實作比較好呢?
:
: 小的目前是用os.popen呼叫ps來實作
: 直接執行第二支程式會成功檢查已有第一支存在
: 秀訊息,並跳出 (yeah 成功)
:
: 可是放進cron的話似乎就沒有作用
: 一堆時間後用ps就可以看到一堆程式在跑… /_\
:
: 再煩請各位大大指點一下了
:
: 謝謝各位
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 36.224.41.9
: → kdjf:放pid到/var/run裡,新的程式直接檢查那個pid還在不在 07/26 07:48
: → Rhinocero:大大的想法很好,我之前也有看到這方式,不過 07/26 17:14
: → Rhinocero:另外回文好了XD 07/26 17:14
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.224.50.87
推 ckc1ark:1. 這樣run第一次不會找到自己這個process嗎? 07/27 01:26
→ ckc1ark:2. crontab的問題應該是ps aux用cron跑有80 col的限制 07/27 01:29
→ Rhinocero:if len(check_process) < 1: 應該是要<=1 07/27 04:51
→ Rhinocero:cron的限制我再查一下,感謝c大回覆 ^^ 07/27 04:52
推 darkgerm:有把 PID 放在 /var/run 的範例嗎? 想知道怎麼做… 07/27 11:50
推 retard:我猜是 cron 沒有 shell 。要查pid用kill -0 吧 07/28 18:34
推 PeacockLiu:可以用 file lock 07/29 03:53
推 lulala453:fcntl.flock 好用 !! 08/01 21:29
推 ckclark:mkdir也可以當做lock來用 08/01 23:41