Exécuter une commande sans me faire attendre

145

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!

le miroir
la source
3
Voir aussi Comment envoyez-vous des applications en ligne de commande directement à l'arrière-plan? si vous avez déjà lancé la commande et souhaitez l’envoyer en arrière-plan.
Gilles

Réponses:

153

Avant d'exécuter la commande, vous pouvez ajouter &à la ligne de commande pour exécuter en arrière-plan:

long-running-command &

Après avoir lancé une commande, vous pouvez appuyer sur CtrlZpour la suspendre, puis sur bgpour la mettre en arrière-plan:

long-running-command
[Ctrl+Z]
bg
Greg Hewgill
la source
J'ai utilisé la commande "find ~ / a.java &" mais je ne suis pas allé en arrière-plan? En outre, j'ai essayé cmd + z (pour mac) .... ça ne marche pas
Abhimanyu Aryan
1
@AbhimanyuAryan, vous voudrez peut-être d'abord déboguer votre find ...commande, puis l'exécuter en arrière-plan. Dans ce cas, l' -nameoption vous manquait .
Alexis Wilke
113

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:

nohup command &

Cela non seulement exécute le processus en arrière-plan, mais génère également un journal (appelé nohup.outdans 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 disownmais c'est plutôt une extension d'autres réponses plutôt qu'une méthode en soi:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

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.

Braiam
la source
4
Administrateur système depuis '95. Jamais entendu parler de désaveu jusqu'à aujourd'hui, merci! Cependant, cela ne fonctionne pas avec tous les shell (vérifié bash, zsh, tcsh. Tcsh n'a pas fonctionné).
Yoonix
L'utilisation nohupdans un shell de contrôle de travail est stupide. Les coques modernes n'envoient pas HUPde processus en arrière-plan. La redirection vers un nom de fichier unique est un petit prix à payer.
poussins
@chicks le cas d'utilisation ici est d'empêcher stderr et stdout de polluer le terminal avec le plus qu'il crée un fichier journal automatiquement.
Braiam
1
command > file.log 2>&1 & disownest un peu plus long que nohup command &mais j'imagine que c'est ce que @chicks suggérait.
joeytwiddle
32

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.logque vous pouvez spécifier. Si vous ne souhaitez pas du tout stocker la sortie, vous pouvez utiliser à la /dev/nullplace 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>&1redirige 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 est 1234, de sorte que vous pouvez le supprimer ultérieurement si vous le souhaitez.kill -9 1234

travnik
la source
2
merci, 2>&1c’est très important parce que la commande peut échouer et l’essayer de produire l’erreur dans certains cas!
ericn
1
Celui-ci a fonctionné quand les réponses ci-dessus ne l'ont pas remercié.
Domagoj
9

Regardez dans l' écran ou tmux . Un exemple avec tmux:

$ tmux new -d 'longrunningcommand'

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.

Yoonix
la source
Cette réponse manque une réponse réelle et sonne comme un RTFM.
Lloeki
5

(Pour être complet - déjà répondu :) Vous mettez une commande en arrière-plan en ajoutant &après la commande:

long_command with arguments > redirection &

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 jobsou jobs -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.

alexis
la source
long_command with arguments &> redirection &rediriger le stderrtrop
Ice-Blaze
3

Vous pouvez exécuter un programme en arrière-plan avec &. Par exemple, si vous voulez exécuter yum install XyZpar exemple, vous pouvez exécuter:

yum install XyZ &

La stdoutou 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 connecter yumà un fichier yum.log:

yum install XyZ > yum.log &

Ou, si vous souhaitez ajouter la sortie à un fichier existant log:

yum install XyZ >> log &

Les erreurs sont imprimées sur stderret non stdout, et peuvent être redirigées vers un fichier de la même manière, mais en utilisant 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Si vous vouliez rediriger les deux stderret stdout, vous pouvez utiliser &>:

yum install XyZ &> output
yum install XyZ &>> output
Davidson Chua
la source
2

Vous pouvez exécuter une commande en arrière-plan en plaçant simplement le &signe après.

Par exemple:

areallylong_command &

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

mkc
la source
0

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.

Meaje
la source