Considérez l' nohup
exé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?
Considérez l' nohup
exé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?
Réponses:
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 tmux
ou 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
nohup ne déconnecte pas une commande du terminal, il ignore votre scriptSIGHUP
et redirigestdout/stderr
vers un fichiernohup.out
, afin que la commande puisse continuer à s'exécuter en arrière-plan après votredéconnexion.
nohup
ne 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’
jobs
peut imprimer les travaux en cours d'exécution et leur état. Si la commande jobs
ne 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 fg
mê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 init
processus. 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.
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 sleep
travail avec le même PID imprimé lorsque vous l'avez généré, tandis que jobs
rien 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).
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:
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
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.