Comment exécuter une commande en arrière-plan et n'obtenir aucune sortie?


111

J'ai écrit deux scripts shell a.shet b.sh. In a.shet b.shj'ai une boucle for infinie et ils impriment une sortie sur le terminal. Je veux écrire un autre script qui appelle à la fois a.shet b.shmais je veux que l'utilisateur reprenne immédiatement le contrôle du terminal, au lieu que le script s'exécute à l'infini et je veux masquer la sortie dans le terminal.

Réponses:


220

À utiliser nohupsi votre tâche en arrière-plan prend beaucoup de temps à se terminer ou si vous utilisez simplement SecureCRT ou quelque chose comme ça pour vous connecter au serveur.

Redirigez stdout et stderr vers /dev/nullpour ignorer la sortie.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Juste pour ajouter, il y a parfois des arguments pour les scripts, puis la commande ci-dessus retournera une redirection de sortie ambiguë .
sabertooth1990

Un meilleur moyen que j'ai trouvé est d'utiliser nohup /path/to/your/script.sh parameter1 > & 1 &Si quelqu'un connaît un meilleur moyen.
sabertooth1990

18
Vous n'en avez pas besoin /dev/null 2>&1si vous l'utilisez nohupcar il ajoute automatiquement tous les flux STDOUT et STDERR au fichier nohup.out. Utilisez juste:nohup /path/to/your/command &
Leonardo

1
@ sabertooth1990 Votre ligne de commande est défectueuse:-bash: syntax error near unexpected token '&'
notes-jj

1
Comment tueriez-vous alors le processus créé?
Alexis_A

33

Redirigez la sortie vers un fichier comme celui-ci:

./a.sh > somefile 2>&1 &

Cela redirigera à la fois stdout et stderr vers le même fichier. Si vous souhaitez rediriger stdout et stderr vers deux fichiers différents, utilisez ceci:

./a.sh > stdoutfile 2> stderrfile &

Vous pouvez utiliser /dev/nullcomme un ou les deux fichiers si vous ne vous souciez pas de stdout et / ou stderr.

Voir la page de manuel bash pour plus de détails sur les redirections.


23

Désolé, c'est un peu tard mais j'ai trouvé la solution idéale pour les commandes somple où vous ne voulez pas de sortie standard ou d'erreur (crédit là où c'est dû: http://felixmilea.com/2014/12/running-bash-commands-background -correctement / )

Cela redirige la sortie vers null et garde l'écran clair:

command &>/dev/null &

2
Remarque: la commande se terminera lorsque le terminal sera fermé.
Banana le

1
Pour tous ceux qui envisagent cela à l'avenir et qui souhaitent une solution pour maintenir les commandes en cours après la fin d'une session, je suggérerais screen ou tmux. Ils exécutent essentiellement une «session dans une session» qui se poursuit après la fermeture de la session initiale. Vous pouvez ensuite vous reconnecter à la session en cours si vous vous reconnectez. Idéal pour exécuter des sauvegardes rsync, par exemple lorsque la synchronisation doit s'exécuter pendant une longue période et que vous ne souhaitez pas laisser votre session en cours d'exécution.
DanteAlighieri

13

S'ils sont dans le même répertoire que votre script qui contient:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

La &fin est ce qui fait que votre script s'exécute en arrière-plan.

La > /dev/null 2>&1partie n'est pas nécessaire - elle redirige les flux stdout et stderr pour que vous n'ayez pas à les voir sur le terminal, ce que vous voudrez peut-être faire pour les scripts bruyants avec beaucoup de sortie.


7

Exécutez dans un sous-shell pour supprimer les notifications et fermer STDOUT et STDERR:

(&>/dev/null script.sh &)

C'est la seule réponse qui n'imprime pas non plus les journaux des travaux en arrière-plan en guise de [1] + 54765 done <emacs>remerciement
alper le

2

Si vous souhaitez exécuter le script dans un kickstart Linux, vous devez exécuter comme ci-dessous.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &


0

Ces exemples fonctionnent bien:

nohup sh prog.sh proglog.log 2> & 1 &

Pour la boucle, vous pouvez utiliser comme ceci:

pour i dans {1..10}; do sh prog.sh; dormir 1; terminé prog.log 2> & 1 &

Il fonctionne en arrière-plan et n'affiche aucune sortie.

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.