web-dev-qa-db-fra.com

Exécutez une commande sans me faire attendre

Sur l'interface CLI, parfois une commande que je tape prend un certain temps à terminer, et parfois je sais quand cela est sur le point de se produire. Je suis un peu confus sur le "backgrounding" et autres sous Linux.

Quelle est la façon la plus courante (ou la plus conviviale) de dire à la CLI que je ne veux pas attendre, veuillez me rendre immédiatement mon invite. Et si cela pouvait me donner une barre de progression ou simplement un spinner occupé, ce serait génial!

147
themirror

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

long-running-command &

Après avoir démarré une commande, vous pouvez appuyer sur CtrlZ pour le suspendre, puis bg pour le mettre en arrière-plan:

long-running-command
[Ctrl+Z]
bg
158
Greg Hewgill

C'est le favori de tous car à part envoyer le processus en arrière-plan, vous n'avez pas à vous soucier de la sortie de texte qui salit votre terminal:

Nohup command &

Cela exécute non seulement le processus en arrière-plan, mais génère également un journal (appelé Nohup.out dans le répertoire actuel, si ce n'est pas possible, votre répertoire personnel) et si vous fermez/déconnectez le shell actuel, le processus n'est pas tué en empêchant le processus enfant de recevoir les signaux parents lorsqu'il est tué (c'est-à-dire la déconnexion, par SIGHUP au parent, ou en fermant le shell actuel).

Il y en a d'autres appelés disown mais 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 du processus sauf si vous utilisez une méthode hackish pour le faire.

118
Braiam

C'est probablement ce que tu veux

my_command > output.log 2>&1 &

cela démarrera votre commande, redirigeant à la fois stdout et stderr vers un output.log que vous pouvez spécifier. Si vous ne vous souciez pas du tout de stocker la sortie - vous pouvez utiliser /dev/null au lieu 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.

aussi, lorsque vous exécutez une commande comme celle-ci, vous devriez obtenir une confirmation du noyau similaire à ceci: [2] 1234 Cela signifie que votre processus s'exécute en arrière-plan et que son identifiant est 1234, vous pouvez donc le tuer plus tard si vous le souhaitez avec kill -9 1234

35
travnik

Regardez écran ou tmux . Un exemple avec tmux:

$ tmux new -d 'longrunningcommand'

Alors que les autres réponses utilisant '&' en arrière-plan fonctionneront, vous devez rediriger stdout (et stderr!). Sans cela, la sortie ira directement à votre Shell, se mélangeant avec n'importe quelle autre sortie que vous pourriez avoir.

La mise en arrière-plan échouera également si vous exécutez une longue commande et que vous vous déconnectez ou que vous vous déconnectez. Le système tuera 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 l'ensemble du shell. Vous pouvez ensuite y revenir ultérieurement, même à partir d'un autre ordinateur. Ils ont tous deux une tonne de fonctionnalités supplémentaires que vous pourriez trouver ou non utiles au-delà de ce cas d'utilisation.

Screen est l'ancien programme éprouvé; tmux est beaucoup plus jeune mais a appris du passé de l'écran.

10
yoonix

(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 du 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 ou 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 parfois arrêté parce qu'il attend une entrée interactive de votre part.

5
alexis

Vous pouvez exécuter un programme en arrière-plan à l'aide de &. Par exemple, si vous souhaitez exécuter yum install XyZ par exemple, vous pouvez exécuter:

yum install XyZ &

Le stdout ou la sortie du programme peut être redirigé en utilisant > pour écraser un fichier, ou >> pour ajouter à un fichier. Par exemple, si vous souhaitez vous connecter yum dans 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 dans stderr et 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 souhaitez rediriger à la fois stderr et stdout, vous pouvez utiliser &>:

yum install XyZ &> output
yum install XyZ &>> output
4
Davidson Chua

Vous pouvez exécuter une commande en arrière-plan simplement en mettant & signez après.

Par exemple:

areallylong_command &

l'exécutera en arrière-plan.

Vous pouvez en outre rediriger le stdout/stderr vers les fichiers appropriés afin qu'ils n'apparaissent pas sur votre terminal pendant que vous faites quelque chose.

Voir ceci pour plus d'informations: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

2
mkc

Essayez d'utiliser la commande "screen" avant de commencer votre longue tâche, puis lorsque vous vous détachez, vous pouvez vous reconnecter avec "screen -r -d" chaque fois que vous en avez besoin. Je trouve que lors de l'utilisation d'un terminal sur ssh ou d'autres connexions réseau, ils peuvent parfois être interrompus par une mauvaise connexion au serveur. l'exécuter dans un "écran" résout ce problème.

0
meaje