1

I'm writing a script to get netstat status using subprocess.Popen.

cmd = 'netstat -nlpt | grep "java" | grep -v tcp6'

result1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True )
stdout, stderr=result1.communicate()

for line in iter(result1.stdout):
    print(line)

The above is giving ValueError: I/O operation on closed file.. Is there any way to get the live-streaming output. In live output from subprocess command they are using writen and readlines here i just need to print live status please some one help me on this issue. Thank you!

  • Does this answer your question? [live output from subprocess command](https://stackoverflow.com/questions/18421757/live-output-from-subprocess-command) – ddelange Aug 10 '23 at 09:45

1 Answers1

1

You get this error due to the stdout file descriptor has already been closed when you want to iterate on it. I have written a working version. This implementation can provide the output of the called command in real-time.

Code:

import sys
import subprocess

cmd = 'netstat -nlpt | grep "java" | grep -v tcp6'

result1 = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True
)

while True:
    out = result1.stdout.read(1)
    if out == "" and result1.poll() is not None:
        break
    if out != "":
        sys.stdout.write(out)
        sys.stdout.flush()

Output:

>>> python3 test.py
tcp        0      0 127.0.0.1:6943          0.0.0.0:*               LISTEN      239519/java         
tcp        0      0 127.0.0.1:63343         0.0.0.0:*               LISTEN      239519/java  

   
milanbalazs
  • 4,811
  • 4
  • 23
  • 45