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.

Behnam Safari
la source

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 &
George
la source
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.

Adam Zalcman
la source
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 &
DanteAlighieri
la source
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.

Michael Chinen
la source
7

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

(&>/dev/null script.sh &)
Tom Hale
la source
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 &
SARATH CHANDRAN
la source
1
nohup sh -x runShellScripts.sh &
vaquar khan
la source
que fait -xquoi?
alper le
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.

Ramin Ismayilli
la source