2017-09-15 82 views
3

是否可以在shell中使用watch命令來處理子進程?使用'watch'命令的子進程

tail = subprocess.Popen("watch -n 1 'tail -n 1 /mnt/syslog/**/*.log | grep :'", shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 

因爲它不爲我工作...

+1

您是否嘗試過使用'os.system(your_cmd)'來運行您的命令? – Aditya

+0

什麼不起作用?發生什麼事? – JohanL

回答

3

你的子命令是正確的,但你指定輸出和錯誤緩衝之後,你需要從他們閱讀。這是做到這一點的一種方法:

1 #!/usr/env/python 
    2 
    3 import subprocess 
    4 import sys 
    5 
    6 cmd = ['watch', '-d', 'tail', '-n', '1', '/var/log/messages'] 
    7 
    8 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    9 
10 for line in iter(lambda: p.stdout.read(1), ''): 
11  sys.stdout.write(line) 
12  sys.stdout.flush() 
13 

我已經聲明瞭該命令作爲列表參數。這是子流程模塊推薦的做法。然後for循環迭代緩衝區,一次讀取1個字節並將其打印到屏幕上。一旦子流程死亡或關閉它,此流將被關閉。