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

136

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, par exemple 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 à le laisser occuper tout le terminal?

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

HARMONIQUE
la source
7
nohup 'commande' & Cela semble fonctionner. Des problèmes avec ça?
OVERTONE

Réponses:

173

Je suis récemment venu pour 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 partial quant à disownce qui peut être utilisé pour séparer un processus de l’arbre actuel. 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 nohupcomme vous l'avez mentionné. Je ne suis pas fou de joie nohupcar il a tendance à écrire ~/nohup.outsans 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 screenque d'autres terminaux de multiplexage virtuels qui maintiennent les sessions en vie entre les connexions. Celles-ci ne vous concernent probablement pas car vous souhaitez simplement un accès temporaire à la sortie du terminal, mais si vous souhaitez revenir plus tard et afficher la dernière activité du terminal, l'écran serait probablement votre meilleur choix.

Internet regorge de screentutoriels, mais voici un simple démarrage rapide:

Oli
la source
Oli, dans le cas de DISPLAY =: 0 unité - remplacer lequel de ce qui précède utiliseriez-vous et pourquoi?
noisette sur natty
4
@nuttyaboutnatty envelopper le tout dans sa propre session shell: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. C'est à peu près ma solution pour tout pour être sûr que tout se passe bien.
Oli
1
@nuttyaboutnatty C'est ce que je veux dire, mais vous ne vous retrouveriez pas avec deux instances en cours d'exécution, car --replacecela ressemble à ce que cela ressemble et met effectivement fin à l'ancienne instance. L'exécuter une deuxième fois depuis xsession mettrait fin à la copie liée à TTYn et vous permettrait de l'utiliser ultérieurement si vous en aviez besoin. Il y a probablement une meilleure façon de le faire, mais ce qui me passe par la tête chaque fois que j'en ai besoin.
Oli
1
Parfait, celui qui a fonctionné pour moi était le sous-shell '(gnome-calculator &)'. Je l'utilise pour lancer une application de console mono en arrière-plan. Avec les autres techniques, l'application mono se planterait instantanément.
Nikolaos Georgiou Le
2
Note aux futurs utilisateurs : la création de nohup.outpeut être supprimée en redirigeant stdout et sterr /dev/nullcomme vous le souhaitez:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy
55

Voici les deux façons que je choisirais. Premièrement, ne pas l'exécuter depuis un terminal; appuyez sur Alt+ F2pour ouvrir la boîte de dialogue d'exécution et exécutez-la à 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 exitou en tapant Ctrl+ D. bash désavoue ensuite ses enfants, puis quitte, laissant les processus en 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
geirha
la source
C'est incroyable! Je n'ai jamais su cela et vous semblez être la seule personne à le mentionner. C'est certainement mon approche préférée dans un environnement de bureau. Dommage que je ne puisse pas faire plus de votes; p
7hi4g0 Le
J'ai essayé cela avec une application différente et cela a échoué: matlab & exitExécuter sous deux commandes distinctes a bien fonctionné:matlab & exit
MattKelly
Je me demandais pourquoi OP a dit que la fermeture du terminal avait provoqué le blocage de ses programmes d'arrière-plan. Je n'ai jamais essayé de fermer un terminal avec le bouton "x" de la fenêtre.
user1717828
le bouton x est kill, il ne se ferme pas proprement, la commande exit le fait. vous pouvez remapper le bouton x sur une commande de sortie à la place ...
Tim Baker
14

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.

desgua
la source
Toute autre alternative? Juste pour le savoir, pas pour rien d'autre
OVERTONE
Sur wikipedia ( en.wikipedia.org/wiki/Nohup ), il existe une suggestion d'utilisation echo command | at nowque je ne pouvais pas faire fonctionner.
Desgua
2
Je me demande comment cela fonctionne à partir de l'interface utilisateur lorsque vous double-cliquez sur une icône ou un programme.
OVERTONE
execfournit une alternative à l' nohup <command> &exécution d'un processus en arrière-plan et au retour de l'invite de shell actuelle.
JSStuball
12

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 shells, Ctrl+ Zarrêtera le processus en cours et vous ramènera à une invite de saisie. Ensuite, vous pouvez émettre

bg

pour envoyer le processus en cours en arrière-plan. Problème

fg

au lieu de remettre le processus en cours au premier plan.

EDIT : Plus de détails dans cette réponse, j'ai découvert plus tard.

krlmlr
la source
7

Utilisé (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
Sergiy Kolodyazhnyy
la source
Hmmm (exec firefox)accroche le terminal jusqu'à ce que je quitte Firefox ... et ferme le terminal SIGHUPs le shell et le sous
kos
J'ai édité ma réponse. Testé avec plusieurs autres programmes. Je n'ai pas vu firefox ou autre programme accrocher le terminal de contrôle dans cette version
Sergiy Kolodyazhnyy
fonctionne bien pour moi
Zanna
Je ne crois pas que l'utilisation de exec de bash soit nécessaire, il se peut que vous ayez besoin du PID pour une raison quelconque.
marinara
2

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

Speter
la source
1

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 -bbalise 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, sans lien, mais il existe un site Web formidable que vous pouvez utiliser pour expliquer les commandes shell. http://explainshell.com/explain/8/sudo

utilisateur3342981
la source
0

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 ça. c’est également utile car vous êtes toujours à jour même si vous travaillez sur l’autre session.

Leo
la source
2
Bienvenue sur Ask Ubuntu! Je recommande de modifier cette réponse pour la développer avec des détails spécifiques sur la manière de procéder. (Voir aussi Comment puis-je écrire une bonne réponse? Pour des conseils généraux sur les types de réponses considérés comme les plus utiles sur Ask Ubuntu.)
David Foerster
0

Dans le cas où KDE est utilisé, vous pouvez également utiliser kstart, qui démarrera votre programme détaché du terminal. Il s'assure également que l'environnement KDE est correctement configuré pour la commande. (Voir kstart.cpple code source pour référence . Comme vous pouvez le voir à partir de là, il utilise KProcess::startDetachedet KProcessest dérivé de QProcess, startDetacheddémarre un nouveau processus et s'en détache.)

Similaire est aussi kde-openou xdg-openou ou gnome-open.

Albert
la source
En l'état actuel des choses, cela ressemble presque plus à un commentaire qu'à une réponse. Veuillez éditer pour développer. Ne vous contentez pas d'un one-liner; expliquez pourquoi vous avez raison, idéalement avec des citations. Les réponses sans explication sont sujettes à suppression.
anonymous2