Comment empêcher la fermeture indésirable de l'application lancée dans Terminal?

10

Je lance des applications depuis le terminal avec des commandes comme celle-ci:

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

La partie importante est la  &.

  • Pour Unix / Linux / Solaris:

    • J'ai appris à l'école qu'en ajoutant  &le programme, le programme se vit tout seul.
    • Je me souviens fortement d'avoir lancé une commande comme  xeyes &et d'avoir exécuté le programme en toute sécurité même après avoir fermé le shell.
  • Sous Mac OS X (Unix à l'intérieur):

    1. Je lance une application avec  &et je ferme la fenêtre Terminal: l'application se ferme!
    2. Pourquoi ce comportement indésirable se produit-il sur Mac OS X?
    3. Comment résoudre ce problème?
Nicolas Barbulesco
la source
Question connexe: apple.stackexchange.com/q/119319/20773
Eric3

Réponses:

7

La façon "standard" d'accomplir ce que vous voulez accomplir (sur OS X ainsi que sur Linux, FreeBSD ou d'autres systèmes) est d'utiliser la commande nohup:

nohup program &

Cela démarrera program, qui s'exécutera en arrière-plan par rapport au shell à cause du &- et ignorera les signaux de raccrochage dus à la commande nohup.

De cette façon, le programme continuera à s'exécuter même si vous fermez le shell. Peu importe si vous fermez le shell parce que vous fermez Terminal.app, ou si vous fermez le shell parce que vous vous déconnectez d'une connexion ssh à l'ordinateur, ou similaire.

jksoegaard
la source
1
Cela crée un fichier nohup.outdans le dossier actuel. Même quand il n'y a rien à écrire. Après quelques semaines, j'aurais des fichiers nohup.outpartout sur mon Mac. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Utilisez soit nohup command>/dev/null&ou command&disown.
Lri
6

Lorsque vous fermez une fenêtre de terminal, il envoie un SIGHUP (signal de raccrochage) au shell, qui envoie ensuite SIGHUP à tous les processus qu'il a démarrés . Il s'agit d'un comportement traditionnel pour bash et de nombreux autres shells, et la solution traditionnelle consiste à utiliser nohup.

Il existe différentes manières dont différentes machines Unix peuvent différer, il est donc possible que les émulateurs de terminaux spécifiques que vous avez utilisés ou les shells spécifiques que vous avez utilisés se soient comportés différemment. Mais ce n'est pas spécifique à OS X. Par exemple, il y a une question sur ce même problème sur Ubuntu.

Alan Shutko
la source
6

À l'aide de l'esperluette " &", vous dites à Terminal d'exécuter le processus en arrière-plan du shell lui-même. Ainsi, lorsque vous fermez le shell (et tuez le processus), l'interface graphique (Mail.app elle-même) se ferme également.

La commande correcte pour lancer Mail depuis le terminal est simplement:

open -a Mail; exit

Edit: Je viens de trouver ceci sur U&L Stack Exchange: Que signifie esperluette à la fin d'une ligne de script shell? Les réponses fournies sont excellentes et expliquent exactement ce qui se passe plus en détail et mieux que jamais! Je recommande fortement de le lire.

njboot
la source
Qu'en est-il de la transmission des paramètres de ligne de commande à l'application? Comme ça:/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 C'est une question distincte - voir la page de manuel pour ouvrir et je pense qu'une question ici
user151019
Qu'en est-il du lancement d'une application spécifique, non pas dans /Applications, mais à un chemin spécifique? Comme ça:/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 ouvrez [chemin complet], ou cd dans le répertoire et ouvrez [fichier]. Vous pouvez utiliser ~ / pour votre dossier de départ et le caractère spécial, "astérisque", comme notation plus courte en supposant qu'aucune autre chaîne ne correspond à la valeur, IE: ~ / De * / Fire * ... et cetera. Ou écrivez simplement un script simple: cat> nameofscript ..... #! / bin / sh .... open [chemin complet] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... et facultatif, mv nameofscript $ PATH / yourpersonalbin. Homme de lecture déconseillé ouvert. C'est une commande simple, et comme une commande simple, le compromis est que ce n'est pas si puissant.
njboot
1
Désolé, encore besoin d'utiliser l'argument -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
3

@jksoegaard a les commandes appropriées mais comme vous l'avez mentionné dans le commentaire, il crée un fichier nohup.out. Pour arrêter la création du fichier nohup.out, vous devez rediriger STDOUT et STDERR ailleurs. La commande complète serait nohup program &>/dev/null &. Cela exécutera votre programme en arrière-plan, ignorant le SIGHUP et envoyant tous les STDOUT et STDERR vers / dev / null.

Cependant, si vous ne vous êtes pas souvenu d'ajouter nohup (comme dans votre question d'origine), vous pouvez utiliser la disown -arhcommande pour marquer tous les travaux en cours en arrière-plan pour ignorer SIGHUP.

Logiciel insomniaque
la source
Belle réponse, mais toujours compliquée. Et belle image de profil. :-)
Nicolas Barbulesco
3

J'ai trouvé la solution :

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

C'est simple, c'est joli, et ça marche!

Les parenthèses  ( )lancent la commande dans un sous-shell.

Nicolas Barbulesco
la source
--et le & retourne du programme vers le shell sans attendre, afin que vous puissiez continuer à utiliser le shell ou le terminer, sans que le programme que vous avez commencé à quitter.
r_alex_hall
0

Ou vous pouvez essayer open -a /Applications/Mail.app

Utilisation: ouvrir [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [noms de fichiers] [--args arguments]
Aide: Ouvrir ouvre des fichiers à partir d'un shell.
      Par défaut, ouvre chaque fichier à l'aide de l'application par défaut pour ce fichier.
      Si le fichier est sous la forme d'une URL, le fichier sera ouvert en tant qu'URL.
Options:
      -a Ouvre avec l'application spécifiée.
      -b Ouvre avec l'identifiant de bundle d'application spécifié.
      -e Ouvre avec TextEdit.
      -t Ouvre avec l'éditeur de texte par défaut.
      -f Lit l'entrée depuis l'entrée standard et ouvre avec TextEdit.
      -F --fresh Lance l'application fraîche, c'est-à-dire sans restaurer les fenêtres. L'état persistant enregistré est perdu, à l'exclusion des documents sans titre.
      -R, --reveal Sélectionne dans le Finder au lieu de l'ouvrir.
      -W, --wait-apps Bloque jusqu'à la fermeture des applications utilisées (même si elles étaient déjà en cours d'exécution).
          --args Tous les arguments restants sont passés en argv à la fonction main () de l'application au lieu d'être ouverts.
      -n, --new Ouvre une nouvelle instance de l'application même si une est déjà en cours d'exécution.
      -j, --hide Lance l'application masquée.
      -g, --background N'amène pas l'application au premier plan.
      -h, --header Recherche dans les emplacements des fichiers d'en-tête les en-têtes correspondant aux noms de fichiers donnés et les ouvre.
      -s Pour -h, le SDK à utiliser; s'ils sont fournis, seuls les SDK dont les noms contiennent la valeur d'argument sont recherchés.
                        Sinon, le SDK avec la version la plus élevée de chaque plate-forme est utilisé.
Halomaple
la source
-2

J'ai trouvé une solution: combattre le mal par le mal.

Je lance mon application avec ce genre de commande:

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

L'obus sort immédiatement. Et l'application survit, même après avoir fermé la fenêtre du terminal.

Mais cette solution n'est pas très pratique.

Nicolas Barbulesco
la source
1
Vous devriez vraiment ouvrir des applications fournies avec open . C'est à l'épreuve du temps car le contenu du bundle change ainsi que canonique.
Ian C.
@Ian - Ici, je suis particulièrement intéressé à ouvrir des applications qui se trouvent sur un chemin spécifique, pas dans /Applicationset non fournies avec mon Mac.
Nicolas Barbulesco
1
.apples dossiers sont appelés "ensembles" et la opencommande peut les lancer, qu'ils se trouvent dans le /Applicationsdossier ou dans tout autre dossier. Le terme «bundle» dans ce contexte ne signifie pas «livré avec OS X».
personne
ouvrir équivaut à cliquer sur l'icône. Ce n'est pas la même chose que de lancer l'application à partir de la ligne de commande comme le demande l'OP.
Ted Bigham