Home > Net >  Execute df | grep -w "/" not parsing output correctly
Execute df | grep -w "/" not parsing output correctly

Time:12-19

I am trying to run the shell command df -h | grep -w "/" using python to watch the root partition usage and wanted to avoid shell=True option for security.

The code I tried as follows:

import subprocess
p1 = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', '-w', '"/"'], stdin=p1.stdout, stdout=subprocess.PIPE)
output=p2.communicate()[0]
print(output)

The output I get is:

$ ./subprocess_df_check.py 
b''

Expected output is:

$ df -h | grep -w "/"
/dev/sdd        251G  4.9G  234G   3% /

CodePudding user response:

The immediate problem is the unnecessary quotes being added.

p2 = subprocess.Popen(['grep', '-w', '"/"'], stdin=p1.stdout, stdout=subprocess.PIPE)

is not equivalent to the shell command grep -w "/". Instead, it's equivalent to the shell command grep -w '"/"', (or grep -w \"/\", or any other means of writing an argument vector that passes literal double-quote characters on the last non-NUL element of grep's argument vector) and wrong for the same reasons.

Use '/', not '"/"'.

CodePudding user response:

Don't use subprocess with df and / or grep. If you already use python, you can use the statvfs function call like:

import os
import time

path = "/"

while True:
    info = os.statvfs(path)
    print("Block size [%d]  Free blocks [%d]  Free inodes [%d]"
          % (info.f_bsize, info.f_bfree, info.f_ffree))
    time.sleep(15)
  • Related