Starten eines Linux-Prozesses im Hintergrund

10

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. Das liegt daran, dass es gestartet wird und dann gewartet wird, bis es fertig ist. Wie kann ich ein Programm starten, ohne darauf zu warten? Ich glaube nicht, dass ich einfach "&" nach jedem Befehl hinzufügen kann, da alle Prozesse immer noch abgebrochen werden, wenn das Skript beendet ist.

Bart van Heukelom
quelle

Antworten:

15

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 empfangen, werden sie beendet. Ob die Verwendung von & ausreicht, hängt von der Anwendung ab. Um sicher zu gehen, benutze nohup wie folgt:

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

Weitere Informationen finden Sie auf den Manpages zu nohup und kill oder im Wikipedia-Artikel zu nohup .

Kim
quelle
Beim erneuten Lesen ist es nicht eindeutig, ob OP die aufrufende Shell verlässt oder nicht. Er erwähnt nur das Verlassen des Skripts, nicht das Verlassen der Shell oder des Terminals.
Adam Bellaire
Wenn Sie meine Antwort noch einmal lesen, werden Sie feststellen, dass ich gesagt habe, dass die Shell, in der das Skript ausgeführt wird, beendet wird. Angenommen, diese Shell verfügt über ein eigenes virtuelles Terminal (keine Subshell oder ähnliches), ist dies korrekt.
Kim
@Kim: Das stimmt. Ihre Antwort ist in Ordnung, ich bin mir nur sicher, ob das OP die aufrufende Shell schließt oder nicht.
Adam Bellaire
10

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

knetworkmanager &
emesene &
keepassx &
Adam Bellaire
quelle
2

Anhand der von Ihnen angegebenen Beispielprogramme sieht es so aus, als würden Sie versuchen, einige Programme zu starten, wenn KDE gestartet wird. Wenn ja, werfen Sie einen Blick auf die Autostart-Funktion von KDE. Dieser Artikel enthält weitere Informationen und Anweisungen zum Hinzufügen von Programmen zum Autostart.

Doug Harris
quelle
Genau das versuche ich zu tun. Ich habe es jetzt behoben, danke.
Bart van Heukelom
1

Verwenden Sie, wie bereits gesagt, den &Operator, um einen Befehl in den Hintergrund zu stellen, wenn die Shell ihn ausführt.

Wenn Sie möchten, dass die Komponententeile in der richtigen Reihenfolge (und nicht gleichzeitig) ausgeführt werden, das Ganze jedoch im Hintergrund angezeigt wird, verwenden Sie eine Unterschale wie die folgende:

(knetworkmanager; emesene; keepassx) &

oder, wenn Sie den Betrieb jedes Teils von der erfolgreichen Fertigstellung des vorherigen Teils abhängig machen möchten, verwenden Sie:

(knetworkmanager && emesene && keepassx) &
dmckee
quelle
0

Das Hinzufügen eines '&' nach jedem Befehl wird definitiv funktionieren. Dies würde bedeuten, dass diese Skripte oder Programme auch nach Abschluss von startup.sh weiter ausgeführt werden.


quelle
0

Eine andere Möglichkeit wäre, den Prozess als Dämon mit / sbin / start-stop-daemon zu starten

Abhinav
quelle