Digamos que tengo un script bash llamado log.sh. En este script, quiero leer la entrada de una tubería, pero también quiero saber el comando utilizado para canalizar la entrada en mí. Ejemplo:
tail -f /var/log/httpd/error | log.sh
En el script de shell, quiero saber el comando tail -f /var/log/httpd/error.

Respuestas:
Akira sugirió usar
lsof.Así es como puedes escribirlo:
whatpipe2.sh
Ejecutándolo:
Otra forma es usar grupos de procesos.
whatpipe1.sh
Ejecutándolo:
Tenga en cuenta que ambos solo funcionan si el comando en el lado izquierdo de la tubería se ejecuta durante el tiempo suficiente para
psverlo. Dijiste que lo estabas usandotail -f, así que dudo que esto sea un problema.fuente
la tubería aparecerá como una entrada en la lista de descriptores de archivos abiertos de su proceso:
también podrías usar algo como:
entonces, que tiene el inodo de la tubería :) ahora puede buscar en cualquier otro proceso debajo
/proc/de esa tubería. entonces tendrás el comando que te está canalizando:en este ejemplo,
catcanalizado a las salassh. en/proc/29889puedes encontrar un archivo llamadocmdlineque te dice exactamente cómo se llamó:los campos de la línea de comando están separados por NUL, por lo que se ve un poco feo :)
fuente
Aquí hay una solución compacta que utiliza
lsofdistribuciones modernas en Linux modernas:Esto enumera los archivos de punto final (
+E) de FD 0 en el proceso de shell actual (-p $$ -a -d 0), luego limita la salida solo a PID (-t), produciendo los PID en ambos lados de la tubería.Tenga en cuenta que:
{ echo Hi; sleep 5 ; } | whatpipe.sh, probablemente producirá unbash(la subshell de entrada) ysleep 5.+Esolo está disponible silsofse compiló con-DHASUXSOCKEPT. Eso debería ser cierto para la mayoría de las distribuciones de Linux modernas, pero compruebe su instalación de todos modos con:lsof -v 2>&1 | grep HASUXSOCKEPTfuente