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)