2010-01-19 8 views
1

que j'ai un script bash:tuyau plusieurs sorties au même fichier en même temps?

#!/bin/bash 
php ./listen.php 3001 3003 26 & 
php ./listen.php 3002 3004 120 & 

puis-je conduit tous au même fichier journal de sortie en même temps sans conflit? exemple:

#!/bin/bash 
php ./listen.php 3001 3003 26 >/tmp/log 2>&1 & 
php ./listen.php 3002 3004 120 >/tmp/log 2>&1 & 

Répondre

4

> écrasements, de sorte que vous aurez envie >> à la place. stdout est mis en mémoire tampon par défaut, ce qui est relativement sûr. stderr ne l'est pas. Vous devriez cependant écrire dans le journal système à la place.

+1

Je suis assez sûr que stdout est en ligne tamponnée uniquement sur le sous-débit sur la plupart des plates-formes. Les écritures très importantes sur stdout sont effectuées dans des blocs BUFSZ, sans tenir compte des fins de ligne. Mais oui, la suggestion de syslog semble la meilleure, il y a des utilitaires que vous pouvez utiliser qui seront syslog de stdin. –

+0

Cela doit être clair: avec> le deuxième des tuyaux à exécuter supprimera la sortie initiale de la première. >> est définitivement nécessaire ici. –

+0

J'ai fini par les rediriger pour séparer les fichiers de log juste pour être sûr :) – jonaz

0

Très probablement si chaque écriture constitue une nouvelle ligne terminée par une ligne.

Les lignes des deux applications seront remplacées. Essayez juste de voir.

2

À moins de vider la sortie standard de manière agressive, vous obtiendrez probablement une sortie entrelacée. Il vaudrait mieux passer à la commande logger (1), qui écrira chaque écriture de manière atomique dans le journal système. Ne vous laissez pas berner (comme je l'étais!) Par l'-f option — il ne vous permet pas de vous connecter à un fichier; il écrit plutôt le contenu de ce fichier dans le journal système. (Merci Platinum Azure pour la correction.)

N.B. Si sur votre système vous n'avez pas les privilèges pour accéder au journal système, vous pouvez utiliser l'option -u pour écrire sur un socket à la place. Vous pouvez utiliser netcat pour connecter le socket à un fichier.

+0

On dirait que -f se réfère vraiment à mettre un fichier spécifique dans les journaux, en fonction des pages de manuel sur ma machine et de votre lien. echo "bla" | logger -f/tmp/blahblah (avec/tmp/blahblah non existant) a produit l'erreur "No such file or directory". –

0

Théoriquement vous pouvez:

#!/bin/bash 

{ php ./listen.php 3001 3003 26 & php ./listen.php 3002 3004 120 & } >/tmp/log 2>&1 

, mais je ne sais pas comment lisible le résultat sera.

Questions connexes