2017-05-09 1 views
0

J'ai un script bash appelé de plusieurs fois Cron avec des paramètres différents et redirigeant leurs sorties à différents journaux à peu près comme ceci:Comment détecter dans un script bash où vont les journaux stdout et stderr?

* * * * * /home/bob/bin/somescript.sh someparameters >> /home/bob/log/param1.log 2>&1 

J'ai besoin de mon script obtenir dans une variable la valeur «/home/bob/log /param1.log "dans ce cas. Il pourrait aussi bien avoir une date calculée pour logfilename au lieu de "param1". La principale raison à partir de maintenant est la réutilisation du même script à des fins similaires et être en mesure d'informer un utilisateur via le dossier surveillé où il devrait rechercher plus d'informations - lui donner un nom de fichier journal dans un fichier d'avertissement.

Comment puis-je détecter à quel journal la sortie (& 1 ou & 1 et & 2) va-t-elle?

Répondre

2

Si vous utilisez Linux, vous pouvez lire les informations du système de fichiers proc. Supposons que vous avez le programme suivant dans stdout.sh.

#! /bin/bash 
readlink -f /proc/$$/fd/1 >&2 

interactivement il montre votre terminal.

$ ./stdout.sh 
/dev/pts/0 

Et avec une redirection, il montre la destination.

$ ./stdout.sh > nix 
/home/ceving/nix 
0

lors de l'exécution/usr/bin/lsof ou/usr/sbin/lsof donne fichier ouvert

lsof -p $$ -a -d 1 

lsof -p $$ -a -d 2 


filename1=$(lsof -p $$ -a -d 1 -F n) 
filename1=${filename1#*$'\n'n} 

filename2=$(lsof -p $$ -a -d 2 -F n) 
filename2=${filename2#*$'\n'n} 
+0

Notez que 'lsof' est un utilitaire non standard. Voir https://unix.stackexchange.com/questions/18614/alternatives-for-lsof-command – cdarke