Einen Linux-Prozess im Hintergrund starten

23923
Bart van Heukelom

Ich versuche, ein Skript zu erstellen, das einige Programme startet

startup.sh

knetworkmanager emesene keepassx 

Das Problem ist, dass beim Ausführen des Skripts nur knetworkmanager gestartet wird. Dies ist so, weil es startet und dann wartet, bis es fertig ist. Wie kann ich ein Programm starten, ohne darauf zu warten? Ich glaube nicht, dass ich nach jedem Befehl einfach ein "&" hinzufügen kann, da alle Prozesse noch beendet werden, wenn das Skript beendet ist.

10

6 Antworten auf die Frage

14
Kim

Wenn die Shell, die das Skript ausführt, beendet wird, sendet sie ein HUP-Signal an die von Ihnen gestarteten Prozesse. Wenn diese das Signal nicht fangen, werden sie abgebrochen. Ob also die Verwendung von & ausreichend ist, hängt von der Anwendung ab. Um sicher zu gehen, benutze nohup so:

nohup your-program >>/dev/null 2>>/dev/null & 

Weitere Informationen finden Sie auf den Man-Pages für nohup und kill oder im Wikipedia-Artikel zu nohup .

Beim erneuten Lesen ist es unklar, ob OP die aufrufende Shell beendet oder nicht. Er erwähnt nur das Verlassen des Skripts, nicht das Verlassen der Shell oder des Terminals. Adam Bellaire vor 15 Jahren 0
Wenn Sie meine Antwort noch einmal lesen, werden Sie feststellen, dass ich gesagt habe, "wenn die Shell, die das Skript ausführt, beendet wird". Angenommen, diese Shell hat ein eigenes virtuelles Terminal (keine Subshell oder etwas anderes), dies ist korrekt. Kim vor 15 Jahren 0
@ Kim: Das stimmt. Ihre Antwort ist gut, ich bin nur sicher, ob das aufrufende Shell vom OP geschlossen wird oder nicht. Adam Bellaire vor 15 Jahren 0
10
Adam Bellaire

Nein, die Prozesse sollten nicht beendet werden, wenn das Skript beendet ist, wenn Sie es verwenden &. Versuch es.

knetworkmanager & emesene & keepassx & 
2
Doug Harris

Anhand der Beispielprogramme, die Sie angegeben haben, scheinen Sie beim Start von KDE einige Programme zu starten. Wenn ja, werfen Sie einen Blick auf die Autostart-Funktion von KDE. Dieser Artikel enthält weitere Informationen und enthält Anweisungen zum Hinzufügen von Programmen zum Autostart.

In der Tat versuche ich das zu tun. Ich habe es jetzt behoben, danke. Bart van Heukelom vor 15 Jahren 0
1
dmckee

Wie andere bereits gesagt haben, verwenden Sie den &Operator, um einen Befehl in den Hintergrund zu stellen, wenn die Shell es ausführt.

Wenn Sie möchten, dass die Komponententeile der Reihe nach ausgeführt werden (und nicht gleichzeitig), aber das Ganze trotzdem im Hintergrund sein soll, verwenden Sie eine Sub-Shell wie folgt:

(knetworkmanager; emesene; keepassx) & 

oder, wenn Sie den Betrieb eines jeden Teils von dem erfolgreichen Abschluss des vorherigen Teils abhängig machen möchten, verwenden Sie Folgendes:

(knetworkmanager && emesene && keepassx) & 
0

Das Hinzufügen eines "&" nach jedem Befehl wird auf jeden Fall funktionieren. Dies würde bedeuten, dass diese Skripts oder Programme auch nach dem Start von startup.sh weiter ausgeführt werden.

0
Abhinav

Eine andere Option wäre, den Prozess als Daemon mit / sbin / start-stop-daemon zu starten