web-dev-qa-db-fra.com

Exécution de programmes en arrière-plan depuis un terminal

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é.

129
OVERTONE

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:

167
Oli

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
51
geirha

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.

14
desgua

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.

11
krlmlr

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
7

Je peux recommander le terminal Byobu. Vous pouvez facilement détacher votre processus en appuyant sur la touche F6.

2
speter

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

1
user3342981

Si KDE est utilisé, vous pouvez également utiliser kstartname__, 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 KProcessest dérivé de QProcessNAME _ , et startDetacheddémarre un nouveau processus et en déconnecte .)

De même, kde-open ou xdg-open ou gnome-open.

0
Albert

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.

0
leo