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?
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:
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 stdout
et stderr
vers un fichier en:
myscript > ~/myscript.log 2>&1 &
Habituellement, vous pouvez supprimer le fichier en le stderr
redirigeant /dev/null
si 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-number
peut être obtenu en exécutant
jobs
2>&1
redirige stderr
vers stdout
.
stty tostop
les travaux d'arrière-plan seront suspendus s'ils tentent d'écrire sur le terminal.
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.8
et 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 nohup
et disown
.
disown
n'empêche pas l'impression de la sortie sur le terminal.
/dev/null
comme 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 de2>&1
redirigerstderr
versstdout
? Peut-être que vous voulez clarifier cela aussi ... Merci.