2013-10-03 93 views
0

我記筆記類在我的電腦上,並通過對Dropbox的公用文件夾共享這些註釋。當我在課堂上記筆記時,在生成PDF之前,我創建了大量不必要的文件(我在LaTeX中記錄筆記)。我不想用不必要的文件混淆我的Dropbox空間,而只想將PDF文件發佈到Dropbox。殺死包含腳本'time.sleep()`

爲了方便這一切,我成立了一個運行Python腳本(見下文)後,每類(一週)一個cronjob。有時,在我導出PDF之前,我在筆記中修復了一些東西,所以我留下了幾分鐘的時間,所以python腳本中有一堆sleep s,等待生成PDF。我今天無意中手動運行了該腳本,並且需要幫助來阻止它。

import os 
import subprocess 

from sys import exit as crash 
from datetime import date as dt 
from time import sleep 

def getToday(): 
answer = dt.strftime(dt.today(), "%b") + str(int(dt.strftime(dt.today(), "%d"))) 
return answer 

def zipNotes(date): 
today = getToday() 
while 1: 
    if today not in os.listdir('.'): 
    with open("FuzzyLog", 'a') as logfile: 
    logfile.write("Sleeping\n") 
    sleep(60*5) # sleep 5 minutes 
    continue 
    if "Notes.pdf" not in os.listdir(today): 
    with open("FuzzyLog", 'a') as logfile: 
    logfile.write("pdf not exported. Sleeping\n") 
    sleep(60*5) # sleep 5 minutes 
    continue 

    subprocess.call("""zip Notes.zip */Notes.pdf""", shell=True) 
    crash(0) 

zipNotes(getToday()) 

由於腳本沒有找到今天(我可以很容易地只創建一個虛擬文件,但是這不是一個「正確」的解決方案)所做的任何文件,它遍歷睡眠狀態無限。由於循環條件非常簡單,我不能指望進程在很長時間內處於活動狀態,以便「在行爲中捕獲它」以獲得其PID來殺死它。

ps aux | grep python不顯示哪個PID在運行我想要殺死的python腳本,也不是ps -ax | grep pythonps -e | grep python

沒有人有任何的想法,而它正在睡覺,我可以怎樣跟蹤python腳本?
我在Mac OSX 10.7.5(Lion)上,如果有問題

+0

如果你要更新的腳本,使之更容易找到並殺死,爲什麼不更新,以使其能夠乾淨地關閉呢? – abarnert

+0

@abarnert:我/可以/更新腳本(如何?),但現在,我被一個已經運行並且需要被殺死的腳本卡住了。我該如何去尋找和殺死這個腳本? – inspectorG4dget

+0

那麼,對於這個一次性案例,只需創建它正在等待的虛擬文件即可。然後看看如何使未來不必要。 – abarnert

回答

1

Unix守護進程處理這個問題的傳統方式是使用「pid文件」。當你的程序啓動時(或者當你的啓動程序啓動你的程序時),它會在一個衆所周知的位置創建一個文件(系統守護進程爲/var/run/<PROGRAM NAME>.pid;每個用戶守護進程沒有通用的等價物),寫入將PID存入該文件(如PID 12345的ASCII字符串12345\n),並在退出時將其刪除。所以,你可以只需kill $(cat /var/run/myprogram.pid)

但是,它似乎並不像你需要這個位置。你可以很容易地設計程序,使其完全關閉,而不是將其設計爲可驅動的。

或者,更容易,除去睡眠;而不是讓cron每隔一小時運行腳本,讓腳本每次睡一分鐘,直到創建PDF文件,只需在創建PDF時使LaunchServices運行腳本。

+0

我只是看着它,並得到如何使用LauchServices(在理論上)。但看到我從來沒有接近過去使用它,是否有更簡單的解決方案(我正在爲此創建文件)?或者,你能否指出我正確的方向,所以我可以開始我的第一個LaunchServices實驗? – inspectorG4dget

+0

@ inspectorG4dget:[創建啓動守護進程和代理](https://developer.apple.com/library/Mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html)是我知道開始的最佳位置。它有一些示例啓動plist文件(如cron時間表,但更靈活,更詳細),用於不同的用例,如每次將文件添加到特定目錄時運行程序。 – abarnert

+0

@ inspectorG4dget:另外,如果從該指南鏈接的參考文檔仍然不完整(自10.4或10.5左右以來我沒有看過),那麼'man launchd.plist'應該包含所有細節。 – abarnert