Es gibt eine Reihe von Problemen mit Ihrem Code oben. Die Hauptprobleme sind wahrscheinlich, dass Ihre listname
eine Zeichenfolge sein sollte (wenn test
keine Zeichenfolge bereits enthält) und dass die Syntax für Ihren zweiten Popen
Aufruf falsch ist (jedes Argument sollte ein eigener Listeneintrag sein).
Auch wenn Sie den zweiten Prozess benötigen, um sudo
zu verwenden, gibt es einige zusätzliche Probleme, je nachdem, ob Sie ein Kennwort hinzufügen müssen oder nicht.
So je nachdem, wie diese Probleme zu umgehen, kann Ihr Code wie eine der folgenden Alternativen aussehen:
from subprocess import Popen, PIPE
listname = 'test'
b = '/tmp/{}.txt'.format(listname)
c = '/tmp/{}.conf'.format(listname)
first = Popen(['/bin/cat', b], stdout=PIPE)
# Alt 1, No sudo
second = Popen(['/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout)
# Alt 2, sudo with no password
second = Popen(['sudo', '/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout)
# Alt 3, add sudo password (most complex)
# Alt 3.1, store password in file (bad)
sudo_password = "clear_text_password"
#Alt 3.2, ask user for password:
from getpass import getpass, getuser
sudo_password = getpass("[sudo] password for {}: ".format(getuser()))
# Since we need to add password at stdin, we cannot directly pipe output from "first"
# instead we set stdin to PIPE, and write sudo password, followed by output from "first"
# sudo -kSp '' ensures that password is read from stdin without prompt being displayed
second = Popen(['sudo', '-kSp', '', '/usr/share/logstash/bin/logstash', '-f', c], stdin=PIPE)
second.stdin.write(sudo_password + '\n') # write password
# followed by output from "first".
for line in first.stdout:
second.stdin.write(line)
second.stdin.close()
Hoffentlich wird Ihnen helfen, eine passende Lösung zu finden. Wenn nicht, bitte spezifizieren Sie Ihre Probleme weiter.
Danke, dass funktioniert wirklich gut :) Verwenden von Alt 2 funktioniert, aber der zweite Prozess endet nicht, sollte ich .communicate verwenden, um dies zu beenden? Ich habe versucht: output = second.communicate() [0] ohne Erfolg. –
Was meinst du mit "hört nicht auf"? Wird es als '' in Ihrer Prozessliste angezeigt (tut 'ps')? In diesem Fall ist es beendet und kann mit 'del second' entfernt werden (und Sie möchten wahrscheinlich auch' del first' machen). Wenn ein Prozess dereferenziert wird, wird Python sicherstellen, dass es Müll gesammelt wird. Wenn der Prozess noch läuft, denke ich, dass es auf mehr Eingabe wartet? –
JohanL