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


Comment exécuter un programme en arrière-plan d'un shell, avec la possibilité de fermer le shell 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 tâche de fond sans avoir à laisser le terminal ouvert ou à occuper tout le terminal?

Sur cette note, j’ai trouvé un moyen d’exécuter des programmes à partir du terminal et d’avoir d’autres entrées, en ajoutant une esperluette (&) à la commande en tant que telle:

nm-applet &

Mais ce n'est pas très utile car tous les processus démarrés dans le terminal sont supprimés une fois le terminal fermé.


121
2018-02-22 00:07


origine


nohup 'commande' & Cela semble fonctionner. Des problèmes avec ça? - OVERTONE


Réponses:


Je viens récemment d'aimer setsid. Il commence par sembler que vous exécutez simplement quelque chose depuis le terminal, mais vous pouvez vous déconnecter (fermer le terminal) et ça continue.

Ceci est dû au fait que la commande est en train de s’éteindre et que l’entrée est transmise au terminal en cours, elle appartient à un parent complètement différent (qui reste actif après la fermeture du terminal).

Un exemple:

setsid gnome-calculator

Je suis aussi assez partisan de disown qui peut être utilisé pour séparer un processus de l'arborescence actuelle. Vous l'utilisez conjointement avec l'esperluette d'arrière-plan:

gnome-calculator & disown

Je viens aussi d'apprendre comment créer des sous-couches 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 suis pas sauvage nohup parce qu'il a tendance à écrire à ~/nohup.out sans que je le demande. Si vous comptez sur cela, cela pourrait être pour vous.

nohup gnome-calculator

Et pour les processus à long terme, il y a des choses comme screen et d'autres multiplexeurs de terminaux virtuels qui maintiennent les sessions actives entre les connexions. Celles-ci ne s’appliquent probablement pas à vous parce que vous voulez simplement accéder temporairement à la sortie du terminal, mais si vous voulez retourner quelque temps plus tard et voir la dernière activité du terminal, l'écran serait probablement votre meilleur choix.

Internet est plein de screen tutoriels mais voici un simple démarrage rapide:


156
2018-02-22 00:41



Oli, dans le cas de AFFICHAGE =: 0 unité - lieu lequel de ces éléments utiliseriez-vous et pourquoi? - nutty about natty
@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 faire en sorte que tout se passe bien. - Oli♦
@nuttyaboutnatty C'est ce que je veux dire mais vous ne vous retrouveriez pas avec deux instances en cours d'exécution parce que --replace fait ce que cela ressemble et termine réellement l'ancienne instance. Le lancer une seconde 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 juste ce qui me vient à l'esprit chaque fois que j'en ai besoin. - Oli♦
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 tomberait en panne instantanément. - Nikolaos Georgiou
Note aux futurs utilisateurs: création de nohup.out peut être supprimé avec la redirection à la fois stdout et sterr à /dev/null ainsi: nohup firefox &> /dev/null & - Sergiy Kolodyazhnyy


Voici les deux façons que je choisirais. Tout d'abord, ne pas l'exécuter depuis un terminal; frappé Alt+F2 pour ouvrir le dialogue d'exécution, et l'exécuter à partir de là (sans &).

Depuis un terminal, courez

nm-applet &

Mais ne fermez PAS le terminal vous-même. Autrement dit, ne cliquez pas sur le bouton X pour fermer et n'utilisez pas Fichier -> Quitter dans la barre de menus. Si vous fermez le terminal de cette façon, il enverra un signal HUP (Hang UP) au bash qui s'exécute, qui à son tour enverra le signal HUP à tous ses enfants (ce qui explique pourquoi nohup fonctionne dans ce cas).

Au lieu de cela, quittez le shell en exécutant exit ou frapper Ctrl+. bash désactive alors ses enfants, puis quitte, laissant les processus d'arrière-plan toujours en cours d'exécution. Et quand bash sort, le terminal a perdu son processus enfant, donc il se ferme aussi.

Tout faire en même temps:

nm-applet & exit

46
2018-02-23 11:45



C'est incroyable! Je n'ai jamais su cela et vous semblez être la seule personne à le mentionner. C'est définitivement mon approche préférée dans un environnement de bureau. Dommage que je ne puisse pas en prendre plus; p - 7hi4g0
J'ai essayé ceci avec une application différente et cela a échoué: matlab & exit Fonctionnant comme deux commandes distinctes fonctionnait bien: matlab &  exit - MattKelly
Je me demandais pourquoi OP a déclaré que la fermeture du terminal provoquait le crash de ses programmes en 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 tuer, il ne sort pas proprement, la commande exit le fait. vous pouvez remapper le bouton x à une commande de sortie à la place ... - Tim Baker


Comme vous l'avez souligné, vous pouvez courir

nohup nm-applet &  

ignorer le signal de fin lors de la fermeture du terminal. Aucun problème avec cela.


13
2018-02-22 00:17



D'autres alternatives? Juste pour le savoir, pas pour autre chose - OVERTONE
À wikipedia ( en.wikipedia.org/wiki/Nohup ) il y a une suggestion à utiliser echo command | at now que je ne pouvais pas le faire fonctionner. - desgua
Je me demande comment cela fonctionne à partir d'une interface utilisateur lorsque vous double-cliquez sur une icône ou un programme. - OVERTONE


Une autre chose qui manque à de nombreuses autres réponses est la manière de détacher un processus en cours qui bloque actuellement le shell. Dans la plupart des terminaux et des coques, Ctrl+Z arrê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 revenir au premier plan.

MODIFIER: Plus de détails dans cette réponse J'ai découvert plus tard.


10
2018-03-31 14:37





Utilisation (exec PROGRAM &> /dev/null & ) pour que le PID du sous-shell soit pris en charge par PROGRAM. J'ai testé cette approche plusieurs fois avec plusieurs programmes différents. La fermeture du terminal d'origine n'a aucun effet sur le programme nouvellement créé

Petite démo:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

7
2017-11-30 11:35



Hmmm (exec firefox) bloque le terminal jusqu'à ce que je quitte Firefox ... et ferme le terminal SIGHUPs du shell et du sous-shell - kos
J'ai édité ma réponse. Je l'ai testé avec plusieurs autres programmes. Je n'ai pas observé Firefox ou autre programme suspendant le terminal de contrôle dans cette version - Sergiy Kolodyazhnyy
fonctionne bien pour moi - Zanna


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


2
2018-03-05 00:07





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

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


1
2018-06-28 14:39





Je ne sais pas comment faire, mais je commence juste une autre session en laissant le précédent tout seul. Par exemple, j'ai exécuté un simple serveur Web sur mon framboise. le web.py puis je commence une nouvelle session en la laissant seule. c'est tout. Il est également utile car vous êtes toujours à jour même si vous travaillez sur l'autre session.


0
2017-07-05 22:15



Bienvenue sur Ask Ubuntu! je recommande modifiercette réponse pour le développer avec des détails spécifiques sur la façon de le faire. (Voir également Comment écrire une bonne réponse? pour des conseils généraux sur les types de réponses les plus utiles sur Ask Ubuntu.) - David Foerster