Re: [問題] 如何讓程式同時只能跑一隻

看板Python作者 (愛火快滅了)時間12年前 (2012/07/26 21:22), 編輯推噓6(603)
留言9則, 7人參與, 最新討論串2/5 (看更多)
感謝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

07/27 01:26, , 1F
1. 這樣run第一次不會找到自己這個process嗎?
07/27 01:26, 1F

07/27 01:29, , 2F
2. crontab的問題應該是ps aux用cron跑有80 col的限制
07/27 01:29, 2F

07/27 04:51, , 3F
if len(check_process) < 1: 應該是要<=1
07/27 04:51, 3F

07/27 04:52, , 4F
cron的限制我再查一下,感謝c大回覆 ^^
07/27 04:52, 4F

07/27 11:50, , 5F
有把 PID 放在 /var/run 的範例嗎? 想知道怎麼做…
07/27 11:50, 5F

07/28 18:34, , 6F
我猜是 cron 沒有 shell 。要查pid用kill -0 吧
07/28 18:34, 6F

07/29 03:53, , 7F
可以用 file lock
07/29 03:53, 7F

08/01 21:29, , 8F
fcntl.flock 好用 !!
08/01 21:29, 8F

08/01 23:41, , 9F
mkdir也可以當做lock來用
08/01 23:41, 9F
文章代碼(AID): #1G4KIPwi (Python)
討論串 (同標題文章)
文章代碼(AID): #1G4KIPwi (Python)