Disons que j'ai un script bash appelé log.sh
. Dans ce script, je veux lire l'entrée d'un tuyau, mais je veux également connaître la commande utilisée pour diriger l'entrée en moi. Exemple:
tail -f /var/log/httpd/error | log.sh
Dans le script shell, je veux connaître la commande tail -f /var/log/httpd/error
.
Réponses:
Akira a suggéré d'utiliser
lsof
.Voici comment vous pouvez l'écrire:
whatpipe2.sh
L'exécuter:
Une autre façon consiste à utiliser des groupes de processus.
whatpipe1.sh
L'exécuter:
Notez qu'ils ne fonctionnent tous les deux que si la commande sur le côté gauche du tuyau s'exécute suffisamment longtemps pour la
ps
voir. Vous avez dit que vous l'utilisiez avectail -f
, donc je doute que ce soit un problème.la source
le tube apparaîtra comme une entrée dans la liste des descripteurs de fichiers ouverts de votre processus:
vous pouvez également utiliser quelque chose comme:
donc, que vous avez l'inode du tuyau :) vous pouvez maintenant rechercher tous les autres processus sous
/proc/
pour ce tuyau. alors vous aurez la commande qui vous redirige:dans cet exemple,
cat
dirigés vers les quartierssh
. en/proc/29889
vous pouvez trouver un fichier appelécmdline
qui vous dit exactement comment s'appelait:les champs de la ligne de commande sont séparés par NUL, donc ça a l'air un peu moche :)
la source
Voici une solution compacte utilisant des
lsof
distributions Linux modernes sur modernes:Cela répertorie les fichiers de point de terminaison (
+E
) de FD 0 sur le processus shell actuel (-p $$ -a -d 0
), puis limite la sortie aux PID uniquement (-t
), produisant les PID des deux côtés du tuyau.Notez que:
{ echo Hi; sleep 5 ; } | whatpipe.sh
produira probablement unbash
(sous-shell d'entrée) etsleep 5
.+E
n'est disponible que si alsof
été compilé avec-DHASUXSOCKEPT
. Cela devrait être vrai pour la plupart des distributions Linux modernes, mais vérifiez quand même votre installation avec:lsof -v 2>&1 | grep HASUXSOCKEPT
la source