使用' watch'进行子流程命令

时间:2017-09-15 17:59:09

标签: python subprocess

是否可以在shell中获取watch命令以使用子进程?

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

因为它对我不起作用......

1 个答案:

答案 0 :(得分:3)

您的subprocess命令是正确的,但在分配stdout和stderr缓冲区后,您需要从中读取它们。这是一种方法:

  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个字节并将其打印到屏幕上。一旦子进程终止或关闭它,该流将被关闭。