2017-09-15 1 views
3

Est-il possible d'utiliser la commande watch dans shell pour travailler avec un sous-processus?Sous-processus avec la commande 'watch'

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

Parce qu'il ne fonctionne pas pour moi ...

+1

Avez-vous essayé d'utiliser 'os.system (your_cmd)' pour exécuter votre commande? – Aditya

+0

Qu'est-ce qui ne fonctionne pas? Qu'est-ce qui se passe? – JohanL

Répondre

3

Votre commande est correcte sous-processus, mais après avoir affecté stdout et tampons stderr vous avez besoin de lire d'eux. C'est une façon de faire cela:

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 

J'ai indiqué la commande comme un argument de liste. C'est ainsi que le module de sous-processus recommande de le faire. Ensuite, la boucle for itère sur le tampon, lisant 1 octet à la fois et l'imprimant à l'écran. Ce flux sera fermé une fois que le sous-processus meurt ou se ferme.