wie man das Verzeichnis und den Spin-off-Prozess ändert

495
Legit Stack

Ich kann das Verzeichnis wechseln:

cd path

Ich kann einen Prozess trennen:

command &, nohup command > /tmp/test_output.txt 2>&1 &, nohup command > /dev/null 2>&1 &, disown command &

Hier ist eine gute Referenz: Wie löse ich einen Prozess vollständig vom Terminal?

Aber ich weiß nicht, wie ich beides gleichzeitig machen soll, das scheint unmöglich zu sein. Kann mir jemand helfen? Hier sind einige Dinge, die ich ausprobiert habe:

path/command nohup cd path && command > /tmp/test_output.txt 2>&1 & cd path && nohup command > /tmp/test_output.txt 2>&1 & cd path && disown command & (cd path && disown command &) (cd path && command) & cd path ; command & 

Ich kann es zu einem Fehler bringen, ich kann es dazu bringen, zu diesem Pfad zu gehen und auszuführen (aber nicht von meinem Terminal getrennt zu werden), oder ich kann es veranlassen, den Befehl getrennt von meinem Terminal auszuführen, aber in meinem aktuellen Arbeitsverzeichnis, nicht dem CD-Pfad .

Ich kann den Prozess nicht von meinem Terminal trennen und gleichzeitig den Befehl aus einem anderen Verzeichnis als meinem eigenen ausführen.

Kannst du mir dabei helfen? Ist es überhaupt möglich?

0

1 Antwort auf die Frage

2
Kamil Maciorowski

Es gibt Unterschiede zwischen nohup, disownund& (Sie können auch finden diese Antwort interessant).

Die von disown commandIhnen verwendete Syntax ist zumindest in Bash ungültig. sehen help disown. In manchen Fällen command & disownreicht das aber

[ command] ist immer noch mit dem Terminal verbunden. Wenn das Terminal zerstört wird, [...] schlägt das Programm fehl, sobald versucht wird, von der Standardeingabe zu lesen oder in die Standardausgabe zu schreiben.

So nohup command &scheint es aber besser

nohup entfernt den Prozess nicht aus der Jobsteuerung der Shell

Das scheint ziemlich harmlos zu sein, aber wenn es Sie stört, nur disownden Job:

nohup command & disown 

Wenn der Job jedoch vor disownActs beendet wird, werden Sie einen anderen Job (falls vorhanden) ablehnen . Der richtige Weg, dies in Bash zu tun ist, zu verwenden$! :

$! Wird auf die Prozess-ID des zuletzt in den Hintergrund gesetzten Jobs erweitert

Also das ist besser:

nohup command & disown $! 

(Da disowndanach nohupmeistens kosmetisch ist, werde ich es von nun an weglassen. Benutze es, wenn du es brauchst).

Um cdvor, commandohne den aktuell Shell zu beeinflussen, ist der beste Weg, um es in einer Subshell zu tun (Du versuchen es, aber nicht mit nohup):

(cd path && nohup command) & 

oder auch

(cd path && exec nohup command) & 

wo execmacht nohupden Subshell Prozess ersetzen, die nicht mehr benötigt wird; nohupwird dann ersetzt durch, commandweil das Werkzeug so funktioniert. Auf diese Weise erhalten Sie einen Prozess anstelle von vielen.

Alternativ können Sie auch nohupeine ganze Shell verwenden. Dadurch können Sie mehrere Befehle ausführen:

nohup sh -c 'cd path || exit; command1; command2' & 

(In diesem Fall execmacht das nur vorher Sinn command2).

Hinweis nohuperstellt eine Datei nohup.out, sofern Sie die Ausgabe nicht umleiten (siehe man 1 nohup). Wo die Datei erstellt wird, hängt vom aktuellen Arbeitsverzeichnis des nohupProzesses ab. Daher macht es im Allgemeinen einen Unterschied, ob Sie cdvorher nohup( cd path && nohup ...) oder umgekehrt ( nohup sh -c 'cd path ... ') vorgehen.