2010-11-18 173 views
8

我需要製作一個腳本,從用戶那裏獲得以下內容:用python殺死進程

1)進程名稱(在linux上)。

2)該進程寫入的日誌文件名。

它需要殺死進程並確認進程已關閉。 使用時間和日期將日誌文件名更改爲新的文件名。 然後再次運行該過程,驗證它是否已啓動,以便它將繼續寫入日誌文件。

在此先感謝您的幫助。所以,你最終有某種內部蟒蛇迷你shell腳本

import os 
os.system("your_command_here; second_command; third; etc") 

+0

進程名稱不是在Linux上是獨一無二的。如果有多個同名的進程會怎麼樣?另外,系統如何知道如何重新啓動過程?您似乎正在複製logrotate功能.... – Spacedman 2010-11-18 12:38:17

+0

如何確保進程死亡實際上正在寫入該日誌文件?聽起來很危險,假設用戶不會犯錯。這些錯誤是否會造成嚴重的不必要情況? – Danosaure 2010-11-18 13:34:32

+0

雖然這對於子進程是正確的,但對於真正簡單的命令,用戶不需要任何使用os.system的子進程的額外複雜性,實際上對代碼和理解來說都更容易。對於我的工作,我已經使用os.system沒有任何問題。 – 2012-09-30 07:23:51

回答

17

可以檢索給它命名使用pgrep命令這樣的進程ID(PID):

import subprocess 
import signal 
import os 
from datetime import datetime as dt 


process_name = sys.argv[1] 
log_file_name = sys.argv[2] 


proc = subprocess.Popen(["pgrep", process_name], stdout=subprocess.PIPE) 

# Kill process. 
for pid in proc.stdout: 
    os.kill(int(pid), signal.SIGTERM) 
    # Check if the process that we killed is alive. 
    try: 
     os.kill(int(pid), 0) 
     raise Exception("""wasn't able to kill the process 
          HINT:use signal.SIGKILL or signal.SIGABORT""") 
    except OSError as ex: 
     continue 

# Save old logging file and create a new one. 
os.system("cp {0} '{0}-dup-{1}'".format(log_file_name, dt.now())) 

# Empty the logging file. 
with open(log_file_name, "w") as f: 
    pass 

# Run the process again. 
os.sytsem("<command to run the process>") 
# you can use os.exec* if you want to replace this process with the new one which i think is much better in this case. 

# the os.system() or os.exec* call will failed if something go wrong like this you can check if the process is runninh again. 

希望這可以幫助

2

如果你知道如何做到這一點的終端,那麼你可以使用以下。我也會考慮讓這個shell腳本自己存在,然後從python調用它:

import os 
os.system("path/to/my_script.sh") 

乾杯!

+0

我喜歡簡單,並且有一件事要添加'os.system'返回退出狀態代碼,以便您可以檢查過程是否成功並通過代碼處理錯誤。 – snarkyname77 2010-11-18 13:38:10

+0

一般來說,程序員不再使用os.system,因爲subprocess.Popen提供了更多選項和支持。特別是,它更好地處理命令行參數並允許管道輸出。 – 2010-11-18 14:37:57

+0

謝謝詹姆斯,我會切換到子過程:) – Morlock 2010-11-18 15:21:26