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?

Pas de clôture
la source

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
Ron
la source
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.

Andrea Corbellini
la source
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