web-dev-qa-db-fra.com

Rediriger toutes les sorties vers un fichier en utilisant Bash sous Linux?

J'essaie de rediriger toutes les sorties d'un programme en ligne de commande vers un fichier. J'utilise Bash. Une partie de la sortie est dirigée vers un fichier, mais une autre partie apparaît toujours dans le terminal et n'est pas stockée dans le fichier.

Des symptômes similaires sont décrits ici:

Rediriger toutes les sorties dans un fichier

Cependant, j'ai essayé la solution proposée (capture stderr) sans succès:

<cmd> <args> > stdout.txt 2> stderr.txt

Le fichier stderr.txt est créé mais est vide.

Un indice possible est que le programme de ligne de commande est un client qui communique avec un serveur sur le même ordinateur. Une partie de la sortie peut provenir du serveur .

Existe-t-il un moyen de capturer toute la sortie du terminal, quelle que soit son origine?

EDIT:

J'ai confirmé que la sortie manquante est générée par le serveur. L'exécution de la commande dans un terminal distinct provoque une sortie dans les deux terminaux. Je peux diriger toute la sortie du terminal de commande vers un fichier. Cela soulève des questions sur la manière de capturer la sortie du serveur, mais la question est différente.

68
Stefan

Si le serveur est démarré sur le même terminal, alors c'est le stderr du serveur qui est probablement en train d'être écrit sur le terminal et que vous ne capturez pas.

Le meilleur moyen de tout capturer serait de lancer:

script output.txt

avant de démarrer le serveur ou le client. Cela lancera un nouveau shell avec toutes les sorties de terminal redirigées vers output.txt ainsi que le terminal. Ensuite, démarrez le serveur à partir de ce nouveau shell, puis le client. Tout ce que vous voyez à l'écran (votre entrée et la sortie de tout ce qui est écrit sur le terminal à partir de ce Shell) sera écrit dans le fichier.

Lorsque vous avez terminé, tapez "exit" pour quitter le shell exécuté par la commande script.

56
Brian Campbell

vous pouvez utiliser cette syntaxe pour rediriger toutes les sorties stderr et stdout vers stdout.txt

<cmd> <args> > allout.txt 2>&1 
100
developer

Bien que pas POSIX, bash 4 a le &> opérateur:

command &> alloutput.txt

52
Patrick Pijnappel

Vous pouvez exécuter un sous-shell et rediriger toutes les sorties tout en plaçant le processus en arrière-plan:

( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
3
chovy

J'ai eu des problèmes avec un programme en panne * tousser PHP toux * Lors d'un crash, le shell qu'il a été exécuté indique le motif du crash, Segmentation fault (core dumped)

Pour éviter que cette sortie ne soit pas journalisée, la commande peut être exécutée dans un sous-shell qui capturera et dirigera ce type de sortie:

sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1
3
ThorSummoner

La bonne réponse est ici: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html

your_command | ssh username@server "cat > filename.txt"
2
Morlock