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é.
la source
Réponses:
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:
Je suis également assez partial quant à
disown
ce qui peut être utilisé pour séparer un processus de l’arbre actuel. Vous l'utilisez en conjonction avec l'esperluette de fond:Je viens également d'apprendre à générer des sous-coquilles avec des parenthèses. Cette méthode simple fonctionne:
Et bien sûr, il y a
nohup
comme vous l'avez mentionné. Je ne suis pas fou de joienohup
car il a tendance à écrire~/nohup.out
sans que je le lui demande. Si vous comptez sur cela, c'est peut-être pour vous.Et pour les processus à plus long terme, il existe des éléments tels
screen
que 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
screen
tutoriels, mais voici un simple démarrage rapide:la source
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.--replace
cela 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.nohup.out
peut être supprimée en redirigeant stdout et sterr/dev/null
comme vous le souhaitez:nohup firefox &> /dev/null &
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
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 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:
la source
matlab & exit
Exécuter sous deux commandes distinctes a bien fonctionné:matlab &
exit
Comme vous l'avez fait remarquer, vous pouvez courir
ignorer le signal de fin lors de la fermeture du terminal. Aucun problème avec ça.
la source
echo command | at now
que je ne pouvais pas faire fonctionner.exec
fournit une alternative à l'nohup <command> &
exécution d'un processus en arrière-plan et au retour de l'invite de shell actuelle.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
pour envoyer le processus en cours en arrière-plan. Problème
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.
la source
Utilisé
(exec PROGRAM &> /dev/null & )
pour permettre à PID du sous-shell d'être repris parPROGRAM
. 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:
la source
(exec firefox)
accroche le terminal jusqu'à ce que je quitte Firefox ... et ferme le terminal SIGHUPs le shell et le sousJe peux recommander le terminal Byobu. Vous pouvez facilement détacher votre processus en appuyant sur la touche F6.
la source
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.
La
-b
balise 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
la source
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.
la source
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. (Voirkstart.cpp
le code source pour référence . Comme vous pouvez le voir à partir de là, il utiliseKProcess::startDetached
etKProcess
est dérivé deQProcess
,startDetached
démarre un nouveau processus et s'en détache.)Similaire est aussi
kde-open
ouxdg-open
ou ougnome-open
.la source