So starten Sie ein Programm im Hintergrund

9

Das Programm Boblight läuft nicht im Hintergrund. Es gibt keinen merklichen Unterschied zwischen der Ausführung

sudo boblightd

und

sudo boblightd& 

Wie kann ich dieses Problem lösen, dass die Konsole keine weiteren Eingaben blockiert?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded
user2534685
quelle
8
Sagen Sie:sudo boblightd > /dev/null 2>&1 &
devnull
Wenn Sie dies nicht zu Lernzwecken tun, verwenden Sie dmenu. Es ist einfach und macht den Job ziemlich gut.
Nishant

Antworten:

22

Der [1] 2289Befehl nach Ihrem Hintergrund zeigt, dass er funktioniert hat und tatsächlich in den Hintergrund gestellt wurde.

Die Ausgabe Ihres Befehls wird jedoch weiterhin an das Terminal gesendet, sofern Sie nicht umleiten. Hier ist der umfassende Weg, dies zu tun:

sudo boblightd >std.txt 2>err.txt &

Wenn Sie möchten, dass sowohl stdout als auch stderr zur selben Datei wechseln:

sudo boblightd >std.txt 2>&1 &

Und wenn Sie sich nicht für die Ausgabe eines oder beider Streams interessieren, können Sie natürlich /dev/nullanstelle eines Dateinamens an senden .

sudo boblightd >/dev/null 2>err.txt &

(Dieses Beispiel wirft die Standardausgabe weg, behält aber stderr bei, nur für den Fall, dass etwas schief geht.)


AKTUALISIEREN

Das Obige basiert auf keiner Kenntnis dessen, was Boblightd ist. Ich sehe in einer anderen Antwort, dass es einen Daemon-Modus hat, so dass in diesem Fall stattdessen verwendet werden sollte.

Übrigens wird davon sudoausgegangen, dass Sie nicht zur Eingabe eines Kennworts aufgefordert werden und dass Sie das Terminalfenster nicht schließen. Für den ersteren würde ich dann normalerweise persönlich sudo bashtippen boblightd >std.txt 2>err.txt &. Eine andere Möglichkeit besteht darin, sudo lseinen harmlosen Befehl auszuführen, um sicherzustellen, dass der Zugriff zwischengespeichert wird.

Für letztere nohupgilt der magische Befehl, um sicherzustellen, dass er auch nach dem Verlassen des Gebäudes ausgeführt wird. Es würde nach dem sudound vor dem eigentlichen Befehl gehen. ZB sudo nohup boblightd >std.txt 2>err.txt &. Oder sudo bashdann nohup boblightd >std.txt 2>err.txt &dann exit(um die Wurzelschale zu verlassen).

Darren Cook
quelle
Es ist auch wichtig zu beachten, dass ein sudoVersuch, nach dem Kennwort zu fragen, fehlschlägt, da Hintergrundprozesse STDIN nicht lesen können.
Patrick
Danke @Patrick. Ich hatte gerade auf das unmittelbare Problem in der Frage geantwortet, aber da dies einige Aufmerksamkeit erhält, habe ich mit der Erwähnung der Passwortabfrage und nohup aktualisiert.
Darren Cook
5

Ich denke, Sie können den Befehl nohup wie folgt verwenden:

nohup sudo boblightd &

Dadurch wird die Ausgabe Ihres Befehls in die Datei nohup.out im aktuellen Verzeichnis verschoben.

Sie können auch den folgenden Bildschirmbefehl verwenden: Erstellen Sie zuerst einen Bildschirm:

screen -S your-sreen-name

Führen Sie dann Ihren Befehl aus:

sudo boblightd

Um den Bildschirm zu speichern und zum Terminal zurückzukehren, geben Sie ein Ctrl+AD( Ctrl+Aist der Hinweis dafür, screendass Sie etwas tun möchten, und D"d" wird dann aus der Sitzung entfernt, ohne sie zu stoppen).

Stellen Sie Ihren Bildschirm wieder her:

screen -d -r your-screen-name

quelle
4

Sie müssen stdout und stderr auf etwas anderes als ihre Standardeinstellungen umleiten, um sie auszublenden. @ devnulls Kommentar zeigt, wie das geht. Das ist ein erster Schritt.

Wenn Sie &Ihr Programm einfach zum Trennen verwenden, wird es beim Abmelden automatisch beendet. Das ist wahrscheinlich nicht das, was du willst. Sie müssen den nohupBefehl verwenden, um dies zu verhindern:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Beachten Sie, dass Sie sudowahrscheinlich nach einem Passwort gefragt werden: Es wird kein Passwort erhalten, und Sie werden nicht bemerken, dass Sie nach einem Passwort gefragt werden, da jede Ausgabe / Eingabe umgeleitet wird. Sie haben sowieso verschiedene Lösungen, um dies zu erreichen:

  • Führen Sie sudovorher einen Befehl aus, sudoum Ihr Passwort zu speichern. Das ist der schnelle und dreißigste Weg.
  • Entfernen Sie das &, geben Sie sudodas Passwort ein und senden Sie den Vorgang mit an den Hintergrund CTRL + Z.
  • Kann sudo auch so konfigurieren, dass das Kennwort für diesen bestimmten Benutzer und das ausführbare Paar nicht abgefragt wird. Beachten Sie, dass dies eine mögliche Sicherheitsverletzung sein kann.
Marc Plano-Lesay
quelle
Ist es besser, das Nohup vor oder nach dem zu haben sudo? Wie sudoerhält man das Passwort, wenn man es unter nohupausführt?
Aaron Digulla
1
Nun, das ist ein guter Punkt: Es wird nicht. Hier haben Sie mehrere Lösungen: Führen Sie vorher einen sudo-Befehl aus, sudo speichert Ihr Passwort. Das ist der schnelle und dreißigste Weg. Eine andere Möglichkeit wäre, das zu entfernen &, sudodas Passwort anzugeben und den Prozess dann mit an den Hintergrund zu senden ctrl + z. Sie können auch konfigurieren sudo, dass das Kennwort für diesen bestimmten Benutzer und das ausführbare Paar nicht abgefragt wird.
(Ich habe dies der Antwort hinzugefügt.)
Normalerweise führe ich sudo bashden nohupBefehl dann in der neuen Shell aus.
Eigentlich ist es falsch, dass, wenn Sie nur den &Hintergrund verwenden, der Prozess beim Abmelden beendet wird. Nur wenn bash mit einem SIGHUP getötet wird, wird es Ihr Programm SIGHUP. Das Abmelden verursacht jedoch kein SIGHUP. Wenn Sie logoutSTRG + D eingeben oder verwenden, wird bash beendet und der Prozess ausgeführt. SIGHUP wird gesendet, wenn Sie den Terminalemulator in einer GUI schließen.
Patrick
2

Boblightd

Im Fall von boblightd wird die an stderr gesendete Ausgabe bereits in der Protokolldatei erfasst (standardmäßig ~ / .boblight / boblightd.log ), sodass diese nicht erfasst werden muss und verworfen werden kann. Außerdem gibt Boblight standardmäßig keine Verzweigung, kann jedoch durch Einfügen des -f in den Befehl ausgeführt werden.

Ich schlage vor, Sie versuchen Folgendes:

sudo boblightd -f >/dev/null 2>/dev/null

(Details aus der Projektdokumentation )

Allgemeiner

Von der Shell gestartete Prozesse werden beendet, wenn die Shell beendet wird. Wie andere bereits betont haben, gibt die Verwendung Ctrl-Zeines Prozesses im Vordergrund die Steuerung an die Shell zurück. Zu diesem Zeitpunkt wird der Prozess jedoch gestoppt . Der bg Befehl wird benötigt, um den Prozess wieder zum Laufen zu bringen, aber im Hintergrund zu bleiben. Es ist entweder eine Prozess-ID oder die Jobnummer erforderlich (wie üblich wird den Jobnummern ein% vorangestellt). Wenn Sie also Ihr zweites Beispiel verwenden, geben Sie entweder eine aus

bg %1

oder

bg 2289

Der Prozess wird jetzt im Hintergrund ausgeführt, ist jedoch weiterhin an die Shell angehängt. Die Verknüpfung zur Shell kann mit dem disownBefehl getrennt werden, wodurch die Verwechslung mit nohup / sudo vermieden wird. Wie bei bg, disownerfordert nur den Prozess - ID oder Auftragsnummer

z.B

disown 2289

Sie können die Shell jetzt sicher beenden, als hätten Sie den Prozess mit dem nohupBefehl ausgeführt

Chilledrat
quelle
1

Da ist die Antwort schon so ziemlich im Kommentar angelegt. Ich hatte das Gefühl, es wäre gut, ein wenig Erklärung als tatsächliche Antwort darauf zu veröffentlichen.

Der Weg ist also: sudo boblightd > /dev/null 2>&1 &

Hier gibt es 3 wichtige Teile. Am wichtigsten ist &am Ende der Zeile. Dadurch wartet die Shell nicht auf das Ende des Befehls, bevor sie die Kontrolle zurückgibt. Es nimmt auch die Standardeingabe von der Tastatur heraus. Es stellt den Job in den Hintergrund.

Dies würde jedoch die Ausgabe immer noch in die Konsole zurücklassen. Um dies zu verhindern, gibt es ein >Symbol, das die Standardausgabe umleitet ( /dev/nullin diesem Fall an).

Zu diesem Zeitpunkt können Sie immer noch die Ausgabe des aufgerufenen Befehls get to screen erhalten. Dies wäre der Standardfehler. Schließlich gibt es also 2>&1Magie. Dadurch wird die Ausgabe vom Standardfehlerstrom zur Standardausgabe umgeleitet.

2und 1stammen aus Standard-Dateideskriptoren. 0wäre stdin, 1- stdout, 2- stderr.

Sie können die Ausgabe bei Bedarf in eine Datei umleiten.

Es gibt Befehle, die für die Interaktion mit Jobs im Hintergrund entwickelt wurden. jobsund fg.

Sie können screenbei Bedarf auch mit fortschrittlicheren Lösungen wie Befehlen spielen.

luk32
quelle