Wie soll man einen "Daemon" -Prozess beim manuellen Start sicher im Hintergrund ausführen?

563
jrhorn424

Ich habe einmal emacsclientals Editor von der Befehlszeile aus gearbeitet, aber es störte mich, dass das Terminalfenster hängen blieb, während ich arbeitete emacs.
Ich habe versucht, den Prozess zu starten emacsclient somefile.txt &, indem ich lief, aber das führte zu einer Menge "gebrochener Pipes". Ich wusste nicht, was es waren, aber meine Dateien wurden beschädigt. Ich habe gelernt mit dem Problem umzugehen.

Vor kurzem habe ich auch angefangen latexmk, Forschungsarbeiten zu erstellen. Ich habe versucht latexmk -pvc &, einen kontinuierlich kompilierenden Prozess im Hintergrund auszuführen, aber wieder stieß ich auf das Thema "gebrochene Pipes".

Ich bin normalerweise in einem Terminal mit Registerkarten und kann ein beschäftigtes Fenster durch Starten eines neuen Fensters umgehen. Ich mag es jedoch, meine vollständige Befehlsübersicht zu haben. Da die meisten Befehle in das erste Terminalfenster eingegeben werden, hat es die beste Historie.

Aber ich finde immer wieder, dass ich aus der Ferne auf Maschinen ohne Bildschirmemulatoren arbeite. Gibt es einen eingebackenen Weg zum Multitasking in einem einzelnen Terminalfenster?

0

1 Antwort auf die Frage

2
cecilkorik

Soweit ich weiß, ist der einzige Grund, warum Sie eine kaputte Pipe mit Hintergrundprozess erhalten würden, wenn Sie das Terminalfenster schließen, mit dem es gestartet wurde. Obwohl es sich im Hintergrund befindet, ist es immer noch über Pipes an stdin und stdout mit Ihrem Terminal verbunden. Wenn Sie das Terminal schließen, abmelden oder das Terminal verlassen, werden die Pipes des Prozesses unterbrochen, und der Prozess erhält ein Signal zum Beenden (SIGHUP, glaube ich).

Die Lösung dafür wäre wahrscheinlich zu verwenden nohup. nohup leitet stdin, stdout und stderr des neuen Hintergrundprozesses an Dateien um und verhindert, dass der Prozess SIGHUP gesendet wird.

Um es zu verwenden, können Sie es ausführen nohup emacsclient somefile.txt &oder wenn Sie die Dateien nohup.out und nohup.err, die zum Erfassen von stdout und stderr verwendet werden, vermeiden möchten, können Sie die Ausgabe vollständig mit löschen nohup emacsclient somefile.txt &> /dev/null &.

Da das Eingeben nur zum Bearbeiten einer Datei schwierig wird, möchten Sie dies wahrscheinlich in einem Alias- oder Shell-Skript verankern.

Ich wusste nicht über "Nohup". Ich bin in der Vergangenheit auch durch Codeausschnitte mit / dev / null verwirrt gewesen, habe mich aber nie darum gekümmert. Danke, dass Sie mir etwas beigebracht haben. :) jrhorn424 vor 13 Jahren 0
Ich bin froh, dass ich helfen konnte, viel Glück! Um zu verdeutlichen, fügt das `&> / dev / null'-Bit sowohl stderr als auch stdout der Datei` / dev / null` hinzu. Das bedeutet, dass sie im Grunde nicht verbunden sind, da / dev / null ein spezielles Gerät ist, das alle Eingaben verwirft. cecilkorik vor 13 Jahren 0