Comment exécuter un programme en arrière-plan d'un shell, avec la possibilité de le fermer tout en laissant le programme en cours d'exécution? Disons que mon interface utilisateur a des problèmes ou pour une raison quelconque, je dois démarrer un programme à partir de la fenêtre du terminal, disons, nm-applet
:
nm-applet
Au démarrage, il occupe le premier plan de la fenêtre du terminal.
Existe-t-il un moyen simple d'exécuter le programme en arrière-plan sans avoir à laisser le terminal ouvert ou à l'occuper en totalité?
Sur cette note, j'ai trouvé un moyen d'exécuter des programmes à partir du terminal et de le laisser autoriser d'autres entrées, en ajoutant une esperluette (&
) à la commande en tant que telle:
nm-applet &
Mais cela n’est pas très utile, car tous les processus démarrés dans le terminal sont supprimés une fois le terminal fermé.
J'ai récemment appris à aimer setsid
. Vous commencez à avoir l’impression que vous exécutez quelque chose à partir du terminal, mais vous pouvez vous déconnecter (fermer le terminal) et cela continue.
Cela est dû au fait que la commande divise en sortie et que, bien que l'entrée parvienne au terminal actuel, elle appartient à un parent complètement différent (qui reste actif après la fermeture du terminal).
Un exemple:
setsid gnome-calculator
Je suis également assez partisan de disown
qui peut être utilisé pour séparer un processus de l'arborescence actuelle. Vous l'utilisez en conjonction avec l'esperluette de fond:
gnome-calculator & disown
Je viens également d'apprendre à générer des sous-coquilles avec des parenthèses. Cette méthode simple fonctionne:
(gnome-calculator &)
Et bien sûr, il y a Nohup
comme vous l'avez mentionné. Je ne raffole pas de Nohup
car il a tendance à écrire dans ~/Nohup.out
sans que je le lui demande. Si vous comptez sur cela, c'est peut-être pour vous.
Nohup gnome-calculator
Et pour les processus à plus long terme, il existe des éléments tels que screen
et d'autres terminaux de multiplexage virtuels qui maintiennent les sessions en vie entre les connexions. Celles-ci ne s’appliquent probablement pas vraiment à vous car vous souhaitez simplement un accès temporaire à la sortie du terminal, mais si vous souhaitez revenir en arrière un peu plus tard et afficher dernière activité du terminal, l’écran serait probablement votre meilleur choix.
Internet regorge de tutoriels screen
, mais voici un simple démarrage rapide:
Voici les deux façons que je choisirais. Premièrement, ne pas l'exécuter depuis un terminal; frappé Alt+F2 pour ouvrir la boîte de dialogue d'exécution et l'exécuter à partir de là (sans &).
Depuis un terminal, lancez
nm-applet &
Mais ne fermez pas le terminal vous-même. En d’autres termes, n’appuyez pas sur le bouton X pour fermer et n’utilisez pas Fichier -> Quitter de la barre de menu. Si vous fermez le terminal de cette façon, il enverra un signal HUP (Hang UP) à la bash qui se trouve à l'intérieur, ce qui à son tour enverra le signal HUP à tous ses enfants (c'est pourquoi Nohup fonctionne dans ce cas).
Au lieu de cela, quittez le shell en exécutant exit
ou en appuyant sur Ctrl+D. bash désavoue ensuite ses enfants, puis quitte, laissant les processus d'arrière-plan toujours en cours d'exécution. Et lorsque bash se termine, le terminal a perdu son processus enfant et se ferme également.
Tout faire en même temps:
nm-applet & exit
Comme vous l'avez fait remarquer, vous pouvez courir
Nohup nm-applet &
ignorer le signal de fin lors de la fermeture du terminal. Aucun problème avec ça.
Il manque encore beaucoup de réponses à la question de savoir comment détacher un processus en cours qui bloque actuellement le shell. Dans la plupart des terminaux et des coquillages, Ctrl+Z arrêtera le processus en cours et vous ramènera à une invite de saisie. Ensuite, vous pouvez émettre
bg
envoyer le processus en cours en arrière-plan. Problème
fg
au lieu de mettre le processus en cours à l'avant-plan.
EDIT: Plus de détail dans cette réponse j'ai découvert plus tard.
Utilisez (exec PROGRAM &> /dev/null & )
pour permettre à PID du sous-shell d'être repris par PROGRAM
. J'ai testé cette approche plusieurs fois avec plusieurs programmes. La fermeture du terminal d'origine n'a aucun effet sur le programme nouvellement généré
Petite démo:
$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Je peux recommander le terminal Byobu. Vous pouvez facilement détacher votre processus en appuyant sur la touche F6.
Bien qu'il y ait de bonnes réponses ci-dessus, je voudrais donner mes 2 centimes sur la façon dont j'utilise MATLAB en arrière-plan.
Sudo -b matlab
La balise -b
de Sudo peut exécuter des applications en arrière-plan. Vous pouvez également fermer le terminal après avoir exécuté cette commande.
Probablement, indépendant, mais il existe un site Web formidable que vous pouvez utiliser pour expliquer les commandes Shell. http://explainshell.com/explain/8/Sudo
Si KDE est utilisé, vous pouvez également utiliser kstart
name__, qui démarrera votre programme en le déconnectant du terminal. Il s'assure également que l'environnement KDE est correctement configuré pour la commande. (Voir __ code source kstart.cpp
pour référence . Comme vous pouvez le voir à partir de là, il utilise KProcess::startDetached
, et KProcess
est dérivé de QProcess
NAME _ , et startDetached
démarre un nouveau processus et en déconnecte .)
De même, kde-open
ou xdg-open
ou gnome-open
.
Je ne sais pas que c'est la bonne façon, mais je viens de commencer une autre session tout en laissant la précédente allone. Par exemple, j'ai couru un simple serveur Web sur ma framboise. le web.py un. alors je commence une nouvelle session en le laissant seul. c'est tout. c’est également utile car vous êtes toujours mis à jour même si vous travaillez sur l’autre session.