Wie kann verhindert werden, dass die im Terminal gestartete Anwendung unerwünscht beendet wird?

Ich starte Anwendungen vom Terminal aus mit Befehlen wie diesem:

/Applications/Mail.app/Contents/MacOS/Mail &

Der wichtige Teil ist die  &.

  • Für Unix/Linux/Solaris:

    • Ich habe in der Schule gelernt, dass das Hinzufügen von  &das Programm von alleine leben lässt.
    • Ich erinnere mich stark daran, einen Befehl wie gestartet  xeyes &und das Programm sicher ausgeführt zu haben, selbst nachdem ich die Shell geschlossen habe.
  • Unter Mac OS X (in Unix):

    1. Ich starte eine App mit  &und schließe das Terminalfenster: Die Anwendung wird beendet!
    2. Warum tritt dieses unerwünschte Verhalten unter Mac OS X auf?
    3. Wie kann das behoben werden?

Antworten (7)

Die "Standard"-Methode, um das zu erreichen, was Sie erreichen möchten (sowohl unter OS X als auch unter Linux, FreeBSD oder anderen Systemen), besteht darin, den Befehl zu verwenden nohup:

nohup program &

Dies startet program, das aufgrund des &- im Hintergrund relativ zur Shell ausgeführt wird, und ignoriert Auflegesignale aufgrund des nohup-Befehls.

Auf diese Weise wird das Programm weiter ausgeführt, obwohl Sie die Shell schließen. Es spielt keine Rolle, ob Sie die Shell schließen, weil Sie Terminal.app schließen, oder ob Sie die Shell schließen, weil Sie eine SSH-Verbindung zum Computer oder ähnliches trennen.

Dadurch wird eine Datei nohup.outim aktuellen Ordner erstellt. Auch wenn es nichts zu schreiben gibt. Nach ein paar Wochen hatte ich nohup.outüberall Dateien auf meinem Mac. :-(
@NicolasBarbulesco Verwenden Sie entweder nohup command>/dev/null&oder command&disown.

Wenn Sie ein Terminalfenster schließen, sendet es ein SIGHUP (Auflegesignal) an die Shell, die dann SIGHUP an alle von ihr gestarteten Prozesse sendet . Dies ist ein traditionelles Verhalten für Bash und viele andere Shells, und die traditionelle Lösung dafür ist die Verwendung von nohup.

Es gibt Möglichkeiten, wie sich verschiedene Unix-Rechner unterscheiden können, daher ist es möglich, dass sich die von Ihnen verwendeten spezifischen Terminalemulatoren oder die von Ihnen verwendeten spezifischen Shells unterschiedlich verhalten haben. Aber es ist nicht spezifisch für OS X. Zum Beispiel gibt es eine Frage zu demselben Problem auf Ubuntu.

Mit dem kaufmännischen Und " &" weisen Sie Terminal an, den Prozess im Hintergrund der Shell selbst auszuführen. Wenn Sie also die Shell schließen (und den Prozess beenden), wird die GUI (Mail.app selbst) ebenfalls geschlossen.

Der richtige Befehl zum Starten von Mail vom Terminal aus lautet einfach:

open -a Mail; exit

Bearbeiten: Ich habe das gerade bei U & L Stack Exchange gefunden: Was bedeutet kaufmännisches Und am Ende einer Shell-Skriptzeile? Die bereitgestellten Antworten sind ausgezeichnet und erklären genau, was vor sich geht, detaillierter und besser als ich es jemals könnte! Ich empfehle dringend, es durchzulesen.

Was ist mit der Übergabe von Befehlszeilenparametern an die App? So was :/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
@NicolasBarbulesco Das ist eine separate Frage - siehe Manpage zum Öffnen und ich denke hier eine Frage
Was ist mit dem Starten einer bestimmten Anwendung, die sich nicht in /Applications, sondern in einem bestimmten Pfad befindet? So was :/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
@NicolasBarbulesco öffne [vollständiger Pfad] oder cd in das Verzeichnis und öffne [Datei]. Sie können ~/ für Ihren Home-Ordner und das Sonderzeichen "Sternchen" als kürzere Schreibweise verwenden, vorausgesetzt, dass keine anderen Zeichenfolgen mit dem Wert übereinstimmen, IE: ~/De*/Fire* ...et cetera. Oder schreiben Sie einfach ein einfaches Skript: cat > nameofscript ..... #! /bin/sh .... [vollständiger Pfad] öffnen .... ^D ..... chmod +x NamedesSkripts..... .\NamedesSkripts .... und optional, mv NamedesSkripts $PFAD/IhrpersönlicherBin. Ich empfehle die Lektüre von Mann offen. Es ist ein einfacher Befehl, und als einfacher Befehl ist der Nachteil, dass er nicht so mächtig ist.
Also: open /Applications/Mail.app/Contents/MacOS/Mail ; exitDies startet Mail. Aber: Dies beendet mein Terminalfenster. Und dies öffnet ein neues Terminalfenster. Und wenn ich das neue Terminalfenster schließe, wird Mail unerwünschterweise beendet! Zurück zu Feld 1.
Tut mir leid, ich muss immer noch das Argument -a verwenden:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
@njboot — Es funktioniert — mit einer /. Aber es beendet mein Terminalfenster.
open verhält sich nicht wie das Starten eines Programms über die Befehlszeile. Wenn es bereits läuft, wird das Fenster einfach nach vorne gebracht, es wird nicht noch einmal ausgeführt.

Ich habe die Lösung gefunden:

(/Applications/Mail.app/Contents/MacOS/Mail &)

Es ist einfach, es ist hübsch und es funktioniert!

Die Klammern  ( )starten den Befehl in einer Sub-Shell.

--und das & kehrt ohne Wartezeit vom Programm zur Shell zurück, sodass Sie die Shell weiter verwenden oder beenden können, ohne das gestartete Programm zu beenden.

@jksoegaard hat die richtigen Befehle, aber wie Sie im Kommentar erwähnt haben, wird eine nohup.out-Datei erstellt. Um zu verhindern, dass die Datei nohup.out erstellt wird, müssen Sie STDOUT und STDERR an eine andere Stelle umleiten. Der vollständige Befehl wäre nohup program &>/dev/null &. Dadurch wird Ihr Programm im Hintergrund ausgeführt, das SIGHUP ignoriert und alle STDOUT- und STDERR-Daten an /dev/null gesendet.

Wenn Sie jedoch nicht daran gedacht haben, nohup hinzuzufügen (wie in Ihrer ursprünglichen Frage), können Sie den disown -arhBefehl verwenden, um alle im Hintergrund ausgeführten Jobs zu markieren, um das SIGHUP zu ignorieren.

Schöne Antwort, aber immer noch kompliziert. Und schönes Profilbild. :-)

Oder Sie können es versuchenopen -a /Applications/Mail.app

Verwendung: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s ][-b ] [-a ] [Dateinamen] [--args Argumente]
Hilfe: Öffnen öffnet Dateien aus einer Shell.
      Öffnet standardmäßig jede Datei mit der Standardanwendung für diese Datei.
      Wenn die Datei in Form einer URL vorliegt, wird die Datei als URL geöffnet.
Optionen:
      -a Öffnet mit der angegebenen Anwendung.
      -b Öffnet mit der angegebenen Anwendungspaket-ID.
      -e Öffnet mit TextEdit.
      -t Öffnet mit Standard-Texteditor.
      -f Liest Eingaben von der Standardeingabe und öffnet mit TextEdit.
      -F --fresh Startet die App neu, d. h. ohne Wiederherstellung von Windows. Der gespeicherte dauerhafte Zustand geht verloren, mit Ausnahme von unbenannten Dokumenten.
      -R, --reveal Wählt im Finder aus, anstatt ihn zu öffnen.
      -W, --wait-apps Blockiert, bis die verwendeten Anwendungen geschlossen werden (auch wenn sie bereits ausgeführt wurden).
          --args Alle verbleibenden Argumente werden in argv an die main()-Funktion der Anwendung übergeben, anstatt geöffnet zu werden.
      -n, --new Öffnet eine neue Instanz der Anwendung, auch wenn bereits eine ausgeführt wird.
      -j, --hide Startet die App versteckt.
      -g, --background Bringt die Anwendung nicht in den Vordergrund.
      -h, --header Durchsucht Speicherorte von Header-Dateien nach Headern, die mit den angegebenen Dateinamen übereinstimmen, und öffnet sie.
      -s Für -h das zu verwendende SDK; falls angegeben, werden nur SDKs durchsucht, deren Namen den Argumentwert enthalten.
                        Andernfalls wird das SDK mit der höchsten Version auf jeder Plattform verwendet.

Ich habe eine Lösung gefunden: Böses mit Bösem bekämpfen.

Ich starte meine App mit dieser Art von Befehl:

/Applications/Mail.app/Contents/MacOS/Mail & exit

Die Shell wird sofort beendet. Und die App überlebt, auch nachdem ich das Terminalfenster geschlossen habe.

Aber diese Lösung ist nicht sehr praktisch.

Sie sollten wirklich Anwendungen öffnen, die mit open gebündelt sind . Das ist zukunftssicher, da sich die Bundle-Inhalte ändern, sowie kanonisch.
@Ian – Hier bin ich besonders daran interessiert, Anwendungen zu öffnen, die sich in einem bestimmten Pfad befinden, nicht in /Applications, und nicht mit meinem Mac gebündelt sind.
.appOrdner werden "Bundles" genannt, und der openBefehl kann sie starten, unabhängig davon, ob sie sich im /ApplicationsOrdner oder in einem anderen Ordner befinden. Der Begriff „Bundle“ bedeutet in diesem Zusammenhang nicht „mit OS X geliefert“.
Öffnen entspricht dem Klicken auf das Symbol. Es ist nicht dasselbe wie das Starten der App über die Befehlszeile, wie es das OP verlangt.