Exécuter une command sans me faire attendre

Sur la CLI, parfois, une command que je tape prend un certain time pour terminer, et parfois je sais quand c'est sur le sharepoint se produire. Je suis un peu confus sur "backgrounding" et tel dans Linux.

Quelle est la façon la plus courante (ou la plus conviviale) de dire à l'interface CLI que je ne veux pas attendre, s'il vous plaît, returnnez-moi immédiatement mon message. Et si ça pouvait me donner une barre de progression ou tout simplement occupé-spinner, ce serait génial!

Avant d'exécuter la command, vous pouvez append & à la command line pour s'exécuter en arrière-plan:

 long-running-command & 

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

 long-running-command [Ctrl+Z] bg 

Ceci est le préféré de tous, car en dehors de l'envoi du process en arrière-plan, vous n'avez pas à vous soucier de la sortie du text salissant votre terminal:

 nohup command & 

Cette opération non seulement exécute le process en arrière-plan, génère également un journal (appelé nohup.out dans le directory home) et si vous fermez / déconnectez le shell actuel, le process n'est pas tué en empêchant le process enfant de recevoir les signaux parents lorsqu'il est tué c'est-à-dire se déconnecter, par SIGHUP au parent, ou fermer le shell courant).

Il y en a d'autres qu'on appelle 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 commands ne vous permettent pas de récupérer facilement les sorties du process, sauf si vous utilisez un moyen hackish pour le faire.

C'est probablement ce que tu veux

my_command > output.log 2>&1 &

cela va démarrer votre command, en redirigeant stdout et stderr vers un output.log que vous pouvez spécifier. Si vous ne voulez pas stocker le résultat, vous pouvez utiliser /dev/null au lieu d'un file réel.

& exécutera la command en arrière-plan afin que vous puissiez continuer à entrer des commands en cours d'exécution. 2>&1 redirige stderr vers stdout afin que toute la sortie soit interceptée.

De même, lorsque vous exécutez une command comme celle-ci, vous devriez get une confirmation du kernel similaire: [2] 1234 Cela signifie que votre process est en cours d'exécution en arrière-plan et que son ID est 1234 , vous pouvez le tuer plus tard si vous souhait avec kill -9 1234

(Pour l'exhaustivité – déjà répondu 🙂 Vous mettez une command en arrière-plan en ajoutant & après la command:

 long_command with arguments > redirection & 

J'ajoute cette réponse pour répondre à l'autre partie de votre question:

Il n'y a pas d'équivalent réel du spinner pour afficher les commands en arrière-plan en cours, mais vous pouvez voir l'état des commands en arrière-plan en tapant des jobs ou des jobs -l . Il vous montrera vos commands en arrière-plan, qu'elles soient en cours d'exécution, arrêtées via un signal (par ex. Avec ^Z ) ou parfois arrêtées car elles attendent une input interactive de votre part.

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

 $ tmux new -d 'longrunningcommand' 

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

L'arrière-plan échouera également si vous exécutez une longue command et déconnectez-vous ou déconnectez-vous. Le système va tuer votre travail.

Si vous n'êtes pas familier avec l'écran ou tmux, ils vous permettent de vous détacher complètement de votre shell. Au lieu de fonder votre programme, vous fondez l'set du shell. Vous pouvez ensuite revenir plus tard, même depuis un autre ordinateur. Ils ont tous deux une tonne plus de fonctionnalités que vous pouvez ou ne pas find utile au-delà de ce cas d'utilisation.

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

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

Par exemple:

 areallylong_command & 

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

Vous pouvez en outre redirect le stdout / stderr vers les files 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

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

 yum install XyZ & 

La sortie stdout ou la sortie du programme peut être redirigée en utilisant > pour écraser un file, ou >> pour append un file. Par exemple, si vous vouliez save yum dans un file yum.log :

 yum install XyZ > yum.log & 

Ou, si vous vouliez append la sortie à un log files existant:

 yum install XyZ >> log & 

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

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

Si vous souhaitez redirect stderr et stdout , vous pouvez utiliser &> :

 yum install XyZ &> output yum install XyZ &>> output 

Essayez d'utiliser la command «écran» avant de commencer votre longue tâche, puis lorsque vous vous détachez, vous pouvez rattacher à «screen -r -d» chaque fois que vous en avez besoin. Je trouve que lorsque vous utilisez un terminal sur ssh ou d'autres connections réseau, ils peuvent parfois être brisés par une mauvaise connection au server. l'exécuter dans un 'écran' corrige ce problème.