10 votes

Comment empêcher l'application lancée dans le terminal de quitter de manière indésirable?

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

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

La partie importante est le &.

  • Pour Unix / Linux / Solaris :

    • J'ai appris à l'école qu'ajouter le & permet au programme de vivre de façon autonome.
    • Je me souviens clairement avoir lancé une commande comme xeyes & et avoir le programme en cours d'exécution en toute sécurité même après avoir fermé l'invite de commande.
  • Sur Mac OS X (Unix à l'intérieur) :

    1. Je lance une application avec & et je ferme la fenêtre du Terminal : l'application se ferme !
    2. Pourquoi ce comportement indésirable se produit-il sur Mac OS X ?
    3. Comment cela peut-il être corrigé ?

0 votes

8voto

Jose Chavez Points 645

La manière "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 va démarrer program, qui s'exécutera en arrière-plan par rapport à la shell en raison du & - et ignorera les signaux de raccrochage en raison de la commande nohup.

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

1 votes

Cela crée un fichier nohup.out dans le dossier actuel. Même s'il n'y a rien à écrire. Après quelques semaines, j'aurais des fichiers nohup.out partout sur mon Mac. :-(

1 votes

@NicolasBarbulesco Utilisez soit nohup commande>/dev/null& soit commande&disown.

6voto

njboot Points 8005

En utilisant l'esperluette "&", vous indiquez à Terminal d'exécuter le processus en arrière-plan du shell lui-même. Ainsi, lorsque vous fermez le shell (et que vous arrêtez le processus), l'interface graphique (Mail.app lui-même) se fermera également.

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

open -a Mail; exit

Édition : Je viens de trouver ceci sur U&L Stack Exchange : Que signifie l'esperluette à la fin d'une ligne de script shell ? Les réponses fournies sont excellentes et expliquent exactement ce qui se passe de manière plus détaillée et mieux que je ne pourrais le faire ! Je recommande vivement de lire attentivement.

0 votes

Que diriez-vous de passer des paramètres en ligne de commande à l'application? Comme ceci : /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &

2 votes

@NicolasBarbulesco C'est une question distincte - voir la page de l'homme pour ouvrir et je pense une question ici

0 votes

Et si on lance une application spécifique, sans être dans /Applications, mais à un chemin spécifique ? Comme ceci : /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/Ma‌​cOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &

6voto

Ido Schacham Points 1373

Lorsque vous fermez une fenêtre de terminal, elle envoie un SIGHUP (signal d'accrochage) à l'interpréteur de commandes, qui envoie ensuite un SIGHUP à tous les processus qu'il a lancés. C'est un comportement traditionnel pour bash et de nombreux autres interpréteurs de commandes, et la solution traditionnelle à ce problème est d'utiliser nohup.

Il existe des façons dont différents systèmes Unix peuvent différer, il est donc possible que les émulateurs de terminal spécifiques que vous avez utilisés ou les interpréteurs de commandes spécifiques que vous avez utilisés se comportent différemment. Mais ce n'est pas spécifique à OS X. Par exemple, il y a une question sur le même problème sur Ubuntu.

4voto

Nicolas Barbulesco Points 2232

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.

0 votes

--et le & renvoie du programme au shell sans attendre, vous pouvez donc continuer à utiliser le shell ou le terminer, sans que le programme que vous avez lancé ne se ferme.

3voto

Insomniac Software Points 1843

@jksoegaard a les commandes appropriées mais comme vous l'avez mentionné dans le commentaire, cela 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, en ignorant le SIGHUP, et en envoyant tout STDOUT et STDERR vers /dev/null.

Cependant, si vous avez oublié d'ajouter nohup (comme dans votre question d'origine), vous pouvez utiliser la commande disown -arh pour marquer tous les emplois en arrière-plan en cours d'exécution pour ignorer le SIGHUP.

0 votes

Belle réponse, encore compliquée. Et belle image de profil. :-)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X