Mettre le travail nohup au premier plan

14

Considérez l' nohupexécution suivante :

nohup script.sh > script.out &

Existe-t-il un moyen de se déconnecter du terminal, de se reconnecter, de ramener le processus au premier plan et d'interagir avec lui à l'aide du clavier?

Adam Matan
la source

Réponses:

7

Si vous vouliez démarrer un script, l'exécuter sans que la sortie ne dérange votre terminal, puis le faire apparaître plus tard pour interagir avec lui, vous voudrez peut-être jeter un œil à un multiplexeur de terminal. Selon votre système, je recommanderais tmuxou screen. Vous pouvez trouver quelques informations sur la façon de les utiliser dans les liens ci-dessous:

tmux:

écran:

modifier: liens ajoutés pour les amorces tmux

Gus E
la source
+1 Excellent outil que je ne connaissais pas. Merci beaucoup.
Adam Matan
19

nohup ne déconnecte pas une commande du terminal, il ignore votre scriptSIGHUPet redirigestdout/stderrvers un fichiernohup.out, afin que la commande puisse continuer à s'exécuter en arrière-plan après votredéconnexion.

nohupne met pas automatiquement la commande qu'il exécute en arrière-plan. Il faut le faire explicitement, en terminant la ligne de commande par un &.

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobspeut imprimer les travaux en cours d'exécution et leur état. Si la commande jobsne le trouve pas, il ne s'agit plus d'un processus enfant de ce shell.

$ jobs 
[1]+  Running                 nohup ./script.sh &

On peut ramener un travail d'arrière-plan au premier plan dans bash en utilisant fgmême s'il est exécuté avec nohup. Mais cela ne changera pas la redirection de sortie, qui ira toujours au fichiernohup.out .

$ fg
nohup ./script.sh

Si vous fermez le shell / terminal ou fermez la session, votre commande n'est plus un enfant de ce shell. Il appartient au initprocessus. Si vous recherchez dans, pstreevous verrez qu'il appartient maintenant au processus 1 ( init). Cela ne peut pas être ramené au premier plan car le premier plan n'existe plus.

souravc
la source
If the command jobs cannot find it, then it is no longer a child process of that shell.Ceci est faux: essayez cette séquence pour voir comment: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Après cette commande, vous verrez toujours le sleeptravail avec le même PID imprimé lorsque vous l'avez généré, tandis que jobsrien ne s'imprimera. La seule façon dont un processus enfant peut cesser d'être un enfant est de perdre son parent (puis l'orphelin devient l'enfant init) ou de bifurquer + quitter (mais le PID change, donc ce n'est pas l'enfant d'origine).
Ruslan
4

Je vais appuyer l'utilisation d'un terminal multiplexeur, mais tmux , pas d'écran. L'écran est, à toutes fins utiles, non entretenu. Sa configuration est un art sombre, probablement enregistré pour la première fois dans une annexe du Necronomicon. Tenter d'écrire votre propre configuration est un aperçu de Cthulu. Sérieusement. Regardez les fichiers .screenrc des gens . Pour être sûr, il existe des moyens de médier l'abomination d'un fichier de configuration par l'écran. Byobu fait un travail admirable en tant que voile entre les utilisateurs mortels et le code impie. Il est livré avec des couleurs sensées, une interface de menu et peut-être plus important encore, une barre d'état.

Mais comme je l'ai dit, je recommande plutôt tmux . Il nécessite toujours une configuration mineure, mais il est bien documenté et votre fichier de configuration ne ressemblera pas à du charabia. De plus, vous commencez avec des couleurs et une barre d'état. Comparez mes fichiers screenrc et tmux.conf:

djeikyb
la source
0

Si vous êtes juste intéressé à regarder la sortie live, cela pourrait vous convenir:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
embrouiller
la source
0

Toute commande Linux peut être envoyée en arrière-plan avec ' &' ajouté en dernier.

Pour afficher tous les travaux d'arrière-plan, vous pouvez émettre jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

Ici, je gère 3 emplois en arrière-plan: zookeeper, kafka et mongo daemon. [1], [2] et [3] sont les numéros de tâche respectifs pour ces tâches.

Vous pouvez mettre ces tâches au premier plan en utilisant fg %$taskNumber.

Sudip Bhandari
la source