Pourquoi puis-je voir la sortie des processus d'arrière-plan?


31

Par exemple, quand je tape ping 8.8.8.8 &, pourquoi pouvons-nous voir le processus ping fonctionner? Et quand je tape find / -name '*test*' &, c'est aussi vu sur le moniteur.

Pourquoi donc? N'est-ce pas vraiment en arrière-plan?

Réponses:


43

Le commande &au shell d'exécuter la commande en arrière-plan, c'est-à-dire qu'il est bifurqué et exécuté dans un sous-shell séparé, en tant que travail, de manière asynchrone.

Notez que lorsque vous mettez &la sortie - stdout et stderr - sera toujours imprimée sur l'écran . Si vous ne voulez voir aucune sortie à l'écran, redirigez les deux stdoutet stderrvers un fichier en:

myscript > ~/myscript.log 2>&1 &

Habituellement, vous pouvez supprimer le fichier en le stderrredirigeant /dev/nullsi vous n'êtes pas inquiet d'analyser les erreurs ultérieurement.

Vous pouvez également exécuter des commandes / scripts en même temps, dans des sous-shells séparés. Par exemple;

./script1 & ./script2 & ./script3 & 

Un travail d'arrière-plan peut être ramené à la ligne de commande avant de terminer avec la commande:

fg <job-number>

Le job-numberpeut être obtenu en exécutant

jobs

Bonne réponse. Vous pouvez inclure que l'on peut également utiliser /dev/nullcomme fichier pour rediriger la sortie du terminal si l'on veut supprimer la sortie au lieu de l'enregistrer quelque part. Et ai-je raison de 2>&1rediriger stderrvers stdout? Peut-être que vous voulez clarifier cela aussi ... Merci.
Byte Commander

@ByteCommander Merci :) édité, j'espère que c'est clair maintenant. Oui, vous avez raison, 2>&1redirige stderrvers stdout.
Ron

3
Je pense qu'il vaut la peine de mentionner que stty tostoples travaux d'arrière-plan seront suspendus s'ils tentent d'écrire sur le terminal.
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

Le seul inconvénient de cela est que l'ordre des sorties vers stdout et stderr peut être mélangé dans le fichier journal.
matthieu

8

Lorsque vous utilisez &, le processus s'exécute en arrière-plan. Mais sa sortie standard reste le terminal.

En fait, vous pouvez exécuter ping 8.8.8.8 &et find / -name '*test*' &en même temps (résultant en une sortie mixte), mais vous ne pouvez pas exécuter ping 8.8.8.8et find / -name '*test*'en même temps sur le même shell.

Si vous ne voulez rien voir, utilisez quelque chose comme ping 8.8.8.8 &> /dev/null &.


En outre, vous souhaiterez peut-être en savoir plus sur nohupet disown.


disownn'empêche pas l'impression de la sortie sur le terminal.
Ruslan

@Ruslan: non, mais il supprime le travail du shell. Ce qui peut ou non intéresser le PO.
Andrea Corbellini
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.