web-dev-qa-db-fra.com

Amener le travail Nohup au premier plan

Considérez ce qui suit NohupNAME _ exécution:

Nohup script.sh > script.out &

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

13
Adam Matan

Si vous souhaitez démarrer un script, faites-le fonctionner sans que la sortie dérange votre terminal, puis relancez-le plus tard pour pouvoir interagir avec lui. Vous voudrez peut-être jeter un coup d'œil sur un multiplexeur de terminaux. Selon votre système, je vous recommanderais tmux ou screen. Vous trouverez des informations sur leur utilisation dans les liens ci-dessous:

tmux:

écran:

edit: liens ajoutés pour les amorces tmux

7
Gus E

Nohup ne déconnecte pas une commande du terminal, le script est ignoré SIGHUP et redirige stdout/stderr vers un fichier Nohup.out, afin que la commande puisse continuer à s'exécuter en arrière-plan après votre déconnexion.

Nohup ne met pas automatiquement la commande en cours d'exécution en arrière-plan. Il faut le faire explicitement, en terminant la ligne de commande par &.

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

jobs peut imprimer les travaux en cours et leur statut. Si la commande jobs ne parvient pas à la trouver, 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 fg même s’il est exécuté avec Nohup. Mais cela ne changera pas la redirection de sortie , qui ira toujours dans le fichier Nohup.out.

$ fg
Nohup ./script.sh

Si vous fermez le shell/terminal ou vous vous déconnectez, votre commande n'est plus un enfant de ce shell. Il appartient au processus init . Si vous recherchez dans pstree, vous 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.

18
souravc

Je seconderai l'utilisation d'un multiplexeur de terminal, mais tmux , pas d'écran. L'écran est, à toutes fins utiles, non maintenu. Sa configuration est un art sombre, probablement enregistré pour la première fois dans une annexe du Necronomicon. Essayer d'écrire votre propre configuration est un aperçu de Cthulu. Sérieusement. Regardez autour de vous . Fichiers screenrc . Pour être sûr, il existe des moyens de médier l'abomination d'un écran de configuration par l'écran. Byob fait un travail admirable en tant que voile entre les utilisateurs mortels et un code impie. Il est livré avec des couleurs judicieuses, 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 bien documenté , et votre fichier de configuration ne ressemblera pas à du charabia. En outre, vous commencez avec des couleurs et une barre d'état. Comparez mes fichiers screenrc et tmux.conf:

4
djeikyb

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

Pour afficher tous les travaux en 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, j'exécute 3 tâches en arrière-plan: zookeeper, kafka et mongo daemon. [1], [2] et [3] sont des numéros de travail respectifs pour ces tâches.

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

0
Sudip Bhandari

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

Nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
0
con-f-use