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

10

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 & macht das Programm selbstständig.
    • Ich kann mich sehr gut daran erinnern, einen Befehl wie xeyes & und das Programm läuft sicher, auch nachdem ich die Shell geschlossen habe.
  • Unter Mac OS X (Unix inside):

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

Antworten:

7

Die "Standard" -Methode, um das zu erreichen, was Sie erreichen möchten (unter OS X sowie unter Linux, FreeBSD oder anderen Systemen), ist die Verwendung des Befehls nohup:

nohup program &

Das wird beginnen program, die wegen der im Hintergrund relativ zur Shell laufen & - und ignoriert Hangup-Signale aufgrund des Befehls nohup.

Auf diese Weise läuft das Programm weiter, 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 die Verbindung zu einem SSH-Computer oder ähnlichem trennen.

jksoegaard
quelle
1
Dadurch wird eine Datei erstellt nohup.out im aktuellen Ordner. Auch wenn es nichts zu schreiben gibt. Nach ein paar Wochen hätte ich Dateien nohup.out überall in meinem Mac. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Verwenden Sie entweder nohup command>/dev/null& oder command&disown.
Lri
6

Wenn Sie ein Terminalfenster schließen, sendet es ein SIGHUP (Hangup-Signal) an die Shell sendet SIGHUP an alle gestarteten Prozesse . Dies ist ein traditionelles Verhalten für Bash und viele andere Shells. Die traditionelle Lösung hierfür ist die Verwendung von Nohup.

Es gibt verschiedene Möglichkeiten, wie sich verschiedene Unix-Maschinen unterscheiden können. Daher ist es möglich, dass sich die von Ihnen verwendeten Terminalemulatoren oder die von Ihnen verwendeten Shells unterschiedlich verhalten haben. Es ist jedoch nicht OS X-spezifisch. Beispielsweise gibt es unter Ubuntu zu diesem Thema eine Frage.

Alan Shutko
quelle
6

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

Der richtige Befehl zum Starten von Mail über das Terminal lautet einfach:

open -a Mail; exit

Bearbeiten: Ich habe dies gerade bei U & amp; L Stack Exchange gefunden: Was bedeutet kaufmännisches Und am Ende einer Shell-Skriptzeile? Die Antworten sind ausgezeichnet und erklären das, was los ist, genauer und besser als ich es je könnte! Ich empfehle es durchzulesen.

njboot
quelle
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 &
Nicolas Barbulesco
2
@NicolasBarbulesco Das ist eine separate Frage - siehe die man-seite zum öffnen und ich denke hier eine frage
Mark
Was ist mit dem Starten einer bestimmten Anwendung, ohne dabei zu sein? /Applications, aber auf einem bestimmten Weg? 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 &
Nicolas Barbulesco
@NicolasBarbulesco öffne [vollständiger Pfad] oder gehe auf CD in das Verzeichnis und öffne [Datei]. Sie können ~ / für Ihren Ausgangsordner und das Sonderzeichen "Stern" als kürzere Schreibweise verwenden, sofern keine anderen Zeichenfolgen mit dem Wert übereinstimmen, dh ~ / De * / Fire * ... und so weiter. Oder schreiben Sie einfach ein einfaches Skript: cat & gt; nameofscript ..... #! / bin / sh .... open [vollständiger Pfad] .... ^ D ..... chmod + x nameofscript ..... \ nameofscript .... und optional mv nameofscript $ PATH / yourpersonalbin. Ich empfehle, Mann offen zu lesen. Es ist ein einfacher Befehl, und als einfacher Befehl ist der Kompromiss nicht so mächtig.
njboot
1
Es tut uns leid, aber ich muss noch das Argument -a verwenden: open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
3

@jksoegaard hat die richtigen Befehle, aber wie Sie im Kommentar erwähnt haben, wird eine Datei nohup.out erstellt. Um die Erstellung der Datei nohup.out zu stoppen, 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-Werte an / dev / null gesendet.

Wenn Sie jedoch nicht daran gedacht haben, nohup hinzuzufügen (wie in Ihrer ursprünglichen Frage), können Sie das verwenden disown -arh Befehl zum Markieren aller im Hintergrund ausgeführten Jobs, um die REGISTRIERUNG zu ignorieren.

Insomniac Software
quelle
Schöne Antwort, aber immer noch kompliziert. Und schönes Profilbild. :-)
Nicolas Barbulesco
3

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 Sie den Befehl in einer Sub-Shell.

Nicolas Barbulesco
quelle
--und das & amp; kehrt ohne zu warten vom Programm zur Shell zurück, sodass Sie die Shell weiterhin verwenden oder beenden können, ohne dass das Programm, das Sie gerade beendet haben, endet
r_alex_hall
0

Oder du kannst es versuchen open -a /Applications/Mail.app

Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s ][-b ] [-a ] [filenames] [--args arguments]
Help: Open opens files from a shell.
      By default, opens each file using the default application for that file.
      If the file is in the form of a URL, the file will be opened as a URL.
Options:
      -a                Opens with the specified application.
      -b                Opens with the specified application bundle identifier.
      -e                Opens with TextEdit.
      -t                Opens with default text editor.
      -f                Reads input from standard input and opens with TextEdit.
      -F  --fresh       Launches the app fresh, that is, without restoring windows. Saved persistent state is lost, excluding Untitled documents.
      -R, --reveal      Selects in the Finder instead of opening.
      -W, --wait-apps   Blocks until the used applications are closed (even if they were already running).
          --args        All remaining arguments are passed in argv to the application's main() function instead of opened.
      -n, --new         Open a new instance of the application even if one is already running.
      -j, --hide        Launches the app hidden.
      -g, --background  Does not bring the application to the foreground.
      -h, --header      Searches header file locations for headers matching the given filenames, and opens them.
      -s                For -h, the SDK to use; if supplied, only SDKs whose names contain the argument value are searched.
                        Otherwise the highest versioned SDK in each platform is used.
Halomaple
quelle
-2

Ich habe eine Lösung gefunden: das Böse mit dem Bösen bekämpfen.

Ich starte meine App mit diesem Befehl:

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

Die Shell wird sofort beendet. Und die App überlebt, auch wenn ich das Terminalfenster schließe.

Diese Lösung ist jedoch nicht sehr praktisch.

Nicolas Barbulesco
quelle
1
Sie sollten wirklich Anwendungen öffnen, die im Lieferumfang enthalten sind öffnen . Das ist zukunftssicher, da sich der Inhalt von Paketen sowohl ändert als auch kanonisch ist.
Ian C.
@Ian - Hier bin ich besonders daran interessiert, Anwendungen zu öffnen, die sich auf einem bestimmten Pfad befinden, nicht in /Applicationsund nicht mit meinem Mac gebündelt.
Nicolas Barbulesco
1
.app Ordner heißen "Bundles", und die open Befehl kann sie starten, ob sie in der sind /Applications Ordner oder einen anderen Ordner. Der Begriff "Bundle" bedeutet in diesem Zusammenhang nicht "Auslieferung mit OS X".
Andrew Medico
Öffnen entspricht dem Klicken auf das Symbol. Es ist nicht dasselbe wie das Starten der App von der Kommandozeile aus, wenn das OP danach fragt.
Ted Bigham