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

10

J'essaie de savoir comment exécuter une commande en arrière-plan, puis de la mettre au premier plan plus tard. J'en ai marre des tutoriels et des réponses où les gens disent que c'est simple, il suffit d'ajouter &à 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 remettre 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 emploi 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 remettre au premier plan.

Timur Fayzrakhmanov
la source

Réponses:

11

C'est impossible comme vous le souhaitez.

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 une collection de groupes de processus, qui sont soit attachés à un périphérique terminal unique (connu sous le nom de terminal de contrôle), soit non attaché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 redonner un terminal de contrôle.

En un mot, la réparation des processus est très limitée dans les systèmes POSIX (la démonétisation est une exception) et vos exigences ne peuvent pas être satisfaites.

sgx1
la source
6
Techniquement, c'est la bonne réponse, mais je pense que les visiteurs qui ont ce problème trouveront "leur solution" dans les autres réponses mentionnant screen / byobu / tmux.
Programster
Vous avez raison .., mais de mon point de vue, les concepts de base sont plus importants pour mieux comprendre le fonctionnement du système et comprendre ce que vous voulez et ce qui ne va pas. Merci à vous deux!
Timur Fayzrakhmanov
16
  1. Installer screen:

    sudo apt-get install screen
  2. Début screen:

    screen -S session_name
  3. Exécutez vos commandes selon vos besoins.

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

    Appuyez sur CTRL+ a+d

  5. Fermez le terminal

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

    screen -r

Pour plus d'informations et des options supplémentaires pour la screenrecherche man screen.

fauconnier
la source
2
Écran ou byobu (surtout si vous utilisez ubuntu). Byobu est basé sur l'écran si je ne me trompe pas, mais je trouve qu'il a des fonctionnalités supplémentaires que je trouve utiles et plus faciles à utiliser, mais c'est une question d'opinion.
Programster le
Merci bonne suggestion! Peut-être que ce sera nécessaire dans la fonctionnalité!) De la Russie avec amour <3
Timur Fayzrakhmanov
@Programster, oui, Byobu est ex. écran. Il a à la fois byobu-screen et byobu-tmux.
user.dz
1
Je recommande tmuxcomme alternative à screen.
gerrit
5

Avez-vous essayé: byobuou tmuxqui sont des multiplexeurs de terminaux. Pas exactement ce que vous recherchez, mais il a un comportement similaire.

byobu-screen

Exécutez ensuite votre commande, pour détacher:

byobu-screen -d

Pour reprendre:

byobu-screen -r

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

user.dz
la source
Ceux-là aussi, +1.
fauconnier