Sur la CLI, parfois, une commande que je tape prend un certain temps, et parfois je sais quand cela se produira. Je suis un peu confus sur "backgrounding" et autres dans Linux.
Quelle est la manière la plus courante (ou conviviale) de dire à la CLI que je ne veux pas attendre, veuillez me rendre mon invite immédiatement. Et si cela pouvait me donner une barre de progression ou juste occupée-spinner, ce serait génial!
command-line
background-process
le miroir
la source
la source
Réponses:
Avant d'exécuter la commande, vous pouvez ajouter
&
à la ligne de commande pour exécuter en arrière-plan:Après avoir lancé une commande, vous pouvez appuyer sur CtrlZpour la suspendre, puis sur
bg
pour la mettre en arrière-plan:la source
find ...
commande, puis l'exécuter en arrière-plan. Dans ce cas, l'-name
option vous manquait .C’est le jeu préféré de tous car, mis à part l’envoi du processus en arrière-plan, vous n'avez pas à vous soucier de la sortie de texte qui salit votre terminal:
Cela non seulement exécute le processus en arrière-plan, mais génère également un journal (appelé
nohup.out
dans le répertoire actuel, si cela n’est pas possible, votre répertoire de base) et si vous fermez / déconnectez le shell actuel, le processus n’est pas tué en empêchant la procédure enfant de recevoir le parent signale quand il est tué (c'est-à-dire en se déconnectant, par SIGHUP vers le parent ou en fermant le shell actuel).Il y a d'autres appelées
disown
mais c'est plutôt une extension d'autres réponses plutôt qu'une méthode en soi:Ces commandes ne vous permettent pas de récupérer facilement les sorties de processus, à moins que vous utilisiez un moyen inflexible de le faire.
la source
nohup
dans un shell de contrôle de travail est stupide. Les coques modernes n'envoient pasHUP
de processus en arrière-plan. La redirection vers un nom de fichier unique est un petit prix à payer.command > file.log 2>&1 & disown
est un peu plus long quenohup command &
mais j'imagine que c'est ce que @chicks suggérait.C'est probablement ce que tu veux
my_command > output.log 2>&1 &
cela lancera votre commande, en redirigeant stdout et stderr vers certains
output.log
que vous pouvez spécifier. Si vous ne souhaitez pas du tout stocker la sortie, vous pouvez utiliser à la/dev/null
place d'un fichier réel.&
exécutera la commande en arrière-plan afin que vous puissiez continuer à saisir des commandes pendant son exécution.2>&1
redirige stderr vers stdout afin que toute la sortie soit interceptée.de plus, lorsque vous exécutez une commande comme celle-ci, vous devez obtenir une confirmation du noyau semblable à celle-ci:
[2] 1234
Cela signifie que votre processus est exécuté en arrière-plan et que son identifiant est1234
, de sorte que vous pouvez le supprimer ultérieurement si vous le souhaitez.kill -9 1234
la source
2>&1
c’est très important parce que la commande peut échouer et l’essayer de produire l’erreur dans certains cas!Regardez dans l' écran ou tmux . Un exemple avec
tmux
:Alors que les autres réponses utilisant '&' to background fonctionneront, vous devez rediriger stdout (et stderr!). Sans cela, la sortie ira directement à votre shell, en se mélangeant avec n'importe quelle autre sortie que vous pourriez avoir.
L'arrière-plan échouera également si vous exécutez une longue commande et que vous vous déconnectez ou êtes déconnecté. Le système va tuer votre travail.
Si vous n'êtes pas familier avec screen ou tmux, ils vous permettent essentiellement de vous détacher complètement de votre shell. Au lieu de mettre en arrière-plan votre programme, vous mettez en arrière-plan le shell entier. Vous pourrez ensuite y revenir plus tard, même à partir d'un autre ordinateur. Ils ont tous deux beaucoup plus de fonctionnalités que vous ne trouverez peut-être pas utiles au-delà de ce cas d'utilisation.
Screen est l'ancien programme éprouvé; tmux est beaucoup plus jeune mais a tiré les leçons du passé de l'écran.
la source
(Pour être complet - déjà répondu :) Vous mettez une commande en arrière-plan en ajoutant
&
après la commande:J'ajoute cette réponse pour répondre à l'autre partie de votre question:
Il n'y a pas vraiment d'équivalent au spinner pour afficher les commandes d'arrière-plan en cours, mais vous pouvez voir l'état des commandes d'arrière-plan en tapant
jobs
oujobs -l
. Il vous montrera vos commandes en arrière-plan et si elles sont en cours d'exécution, arrêtées via un signal (par exemple, avec^Z
) ou occasionnellement parce qu'elles attendent une entrée interactive de votre part.la source
long_command with arguments &> redirection &
rediriger lestderr
tropVous pouvez exécuter un programme en arrière-plan avec
&
. Par exemple, si vous voulez exécuteryum install XyZ
par exemple, vous pouvez exécuter:La
stdout
ou les sorties du programme peuvent être redirigées en utilisant>
pour écraser un fichier ou>>
pour l’ajouter à un fichier. Par exemple, si vous souhaitez vous connecteryum
à un fichieryum.log
:Ou, si vous souhaitez ajouter la sortie à un fichier existant
log
:Les erreurs sont imprimées sur
stderr
et nonstdout
, et peuvent être redirigées vers un fichier de la même manière, mais en utilisant2>
:Si vous vouliez rediriger les deux
stderr
etstdout
, vous pouvez utiliser&>
:la source
Vous pouvez exécuter une commande en arrière-plan en plaçant simplement le
&
signe après.Par exemple:
va l'exécuter en arrière-plan.
Vous pouvez également rediriger stdout / stderr vers les fichiers appropriés afin qu'ils n'apparaissent pas sur votre terminal lorsque vous effectuez une opération.
Voir ceci pour plus d'informations: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
la source
Essayez d'utiliser la commande 'screen' avant de commencer votre tâche longue. Lorsque vous vous détachez, vous pouvez vous reconnecter à avec 'screen -r -d' chaque fois que vous en avez besoin. Je constate que lorsque vous utilisez un terminal sur ssh ou d'autres connexions réseau, ils peuvent parfois être interrompus par une mauvaise connexion au serveur. son exécution dans un "écran" corrige ce problème.
la source