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
ps
verlo. 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,
cat
canalizado a las salassh
. en/proc/29889
puedes encontrar un archivo llamadocmdline
que 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
lsof
distribuciones 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
.+E
solo está disponible silsof
se 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 HASUXSOCKEPT
fuente