web-dev-qa-db-fra.com

Comment définir la commande en arrière-plan, fermer le terminal et le ramener à fg?

J'essaie de savoir comment exécuter une commande en arrière-plan, puis la faire apparaître au premier plan plus tard. J'en ai marre des tutoriels et des réponses où les gens disent que c'est simple, ajoutez simplement & à la fin de la commande pour l'exécuter en arrière-plan. Cela ne fonctionne que dans une seule fenêtre de terminal. Je veux mettre la commande en arrière-plan dans un terminal et la ramener au premier plan après la réouverture du terminal

Exemple:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Bien sûr, après la fermeture du terminal, aucun travail n’est trouvé.

Exemple suivant:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

Qu'ai-je fait de mal? Quelqu'un pourrait-il m'expliquer comment exécuter la commande en arrière-plan et la ramener au premier plan?.

10
Timur Fayzrakhmanov

C'est impossible comme tu veux.

Passons en revue quelques concepts de base:

  • Un groupe de processus est un ensemble de processus liés qui peuvent tous être signalés en même temps.
  • Une session est un ensemble de groupes de processus, qui sont rattachés à un seul terminal (appelé terminal de contrôle) ou non rattachés à un terminal.

Si vous avez fermé le terminal, tous les processus de la session sont morts, à l'exception de ceux (démons) associés au processus init. Et il n'y a aucun moyen de leur donner à nouveau un terminal de contrôle.

Dans Word, le reparenting de processus est très limité dans les systèmes POSIX (la démonisation est une exception) et vos exigences ne peuvent pas être satisfaites.

11
sgx1
  1. Installez screenname__:

    Sudo apt-get install screen
    
  2. Démarrer screenname__:

    screen -S session_name
    
  3. Exécutez vos commandes ce dont vous avez besoin.

  4. Détachez screendu terminal (vos commandes seront toujours en cours d'exécution):

    Presse CTRL+a+d

  5. Fermer le terminal

  6. Ouvrez un autre terminal et rattachez la dernière session screenname__:

    screen -r
    

Pour plus d'informations et d'options supplémentaires pour screenname__, reportez-vous à man screen.

16
falconer

Avez-vous essayé: byobu ou tmux qui sont des multiplexeurs de terminaux. Ce n'est pas exactement ce que vous recherchez, mais le comportement est similaire.

byobu-screen

Ensuite, lancez votre commande, pour détacher:

byobu-screen -d

Pour reprendre:

byobu-screen -r

Voir https://help.ubuntu.com/community/Screen

5
user.dz