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
shell
sudo
background-process
user2534685
quelle
quelle
sudo boblightd > /dev/null 2>&1 &
dmenu
. Es ist einfach und macht den Job ziemlich gut.Antworten:
Der
[1] 2289
Befehl 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:
Wenn Sie möchten, dass sowohl stdout als auch stderr zur selben Datei wechseln:
Und wenn Sie sich nicht für die Ausgabe eines oder beider Streams interessieren, können Sie natürlich
/dev/null
anstelle eines Dateinamens an senden .(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
sudo
ausgegangen, 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önlichsudo bash
tippenboblightd >std.txt 2>err.txt &
. Eine andere Möglichkeit besteht darin,sudo ls
einen harmlosen Befehl auszuführen, um sicherzustellen, dass der Zugriff zwischengespeichert wird.Für letztere
nohup
gilt der magische Befehl, um sicherzustellen, dass er auch nach dem Verlassen des Gebäudes ausgeführt wird. Es würde nach demsudo
und vor dem eigentlichen Befehl gehen. ZBsudo nohup boblightd >std.txt 2>err.txt &
. Odersudo bash
dannnohup boblightd >std.txt 2>err.txt &
dannexit
(um die Wurzelschale zu verlassen).quelle
sudo
Versuch, nach dem Kennwort zu fragen, fehlschlägt, da Hintergrundprozesse STDIN nicht lesen können.Ich denke, Sie können den Befehl nohup wie folgt verwenden:
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:
Führen Sie dann Ihren Befehl aus:
Um den Bildschirm zu speichern und zum Terminal zurückzukehren, geben Sie ein Ctrl+AD( Ctrl+Aist der Hinweis dafür,
screen
dass Sie etwas tun möchten, und D"d" wird dann aus der Sitzung entfernt, ohne sie zu stoppen).Stellen Sie Ihren Bildschirm wieder her:
quelle
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 dennohup
Befehl verwenden, um dies zu verhindern:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Beachten Sie, dass Sie
sudo
wahrscheinlich 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:sudo
vorher einen Befehl aus,sudo
um Ihr Passwort zu speichern. Das ist der schnelle und dreißigste Weg.&
, geben Siesudo
das Passwort ein und senden Sie den Vorgang mit an den Hintergrund CTRL + Z.quelle
sudo
? Wiesudo
erhält man das Passwort, wenn man es unternohup
ausführt?&
,sudo
das Passwort anzugeben und den Prozess dann mit an den Hintergrund zu sendenctrl + z
. Sie können auch konfigurierensudo
, dass das Kennwort für diesen bestimmten Benutzer und das ausführbare Paar nicht abgefragt wird.sudo bash
dennohup
Befehl dann in der neuen Shell aus.&
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 Sielogout
STRG + D eingeben oder verwenden, wird bash beendet und der Prozess ausgeführt. SIGHUP wird gesendet, wenn Sie den Terminalemulator in einer GUI schließen.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:
(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 ausoder
Der Prozess wird jetzt im Hintergrund ausgeführt, ist jedoch weiterhin an die Shell angehängt. Die Verknüpfung zur Shell kann mit dem
disown
Befehl getrennt werden, wodurch die Verwechslung mit nohup / sudo vermieden wird. Wie beibg
,disown
erfordert nur den Prozess - ID oder Auftragsnummerz.B
Sie können die Shell jetzt sicher beenden, als hätten Sie den Prozess mit dem
nohup
Befehl ausgeführtquelle
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/null
in 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>&1
Magie. Dadurch wird die Ausgabe vom Standardfehlerstrom zur Standardausgabe umgeleitet.2
und1
stammen aus Standard-Dateideskriptoren.0
wärestdin
,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.
jobs
undfg
.Sie können
screen
bei Bedarf auch mit fortschrittlicheren Lösungen wie Befehlen spielen.quelle