Saltar al contenido

¿Cómo puedo corregir un error de tubería rota?

Tenemos la mejor información que descubrimos en todo internet. Nosotros esperamos que te sea útil y si quieres aportar cualquier detalle que nos pueda ayudar a mejorar hazlo con total libertad.

Solución:

Ver “Tubería rota” en esta situación es raro, pero normal.

cuando corres type rvm | head -1bash ejecuta type rvm en un proceso, head -1 en otro.1 El estándar de type está conectado al extremo de “escritura” de un tubola entrada estándar de head hasta el final de “lectura”. Ambos procesos se ejecutan al mismo tiempo.

Él head -1 proceso lee datos de stdin (generalmente en fragmentos de 8 kB), imprime una sola línea (según el -1 opcional) y sale, lo que hace que se cierre el extremo de “lectura” de la tubería. Desde el rvm La función es bastante larga (alrededor de 11 kB después de ser analizada y reconstruida por bash), esto significa que head sale mientras type todavía tiene algunos kB de datos para escribir.

En este punto, desde type está tratando de escribir en una tubería cuyo otro extremo ha sido cerrado: un roto tubería: la función write() que llamó devolverá un error EPIPE, traducido como “tubería rota”. Además de este error, el núcleo también envía la señal SIGPIPE a typeque por defecto mata el proceso inmediatamente.

(La señal es muy útil en shells interactivos, ya que la mayoría de los usuarios no quieren que el primer proceso siga ejecutándose e intentando escribir en ninguna parte. Mientras tanto, los servicios no interactivos ignoran SIGPIPE; no sería bueno que un demonio de ejecución prolongada mueren en un error tan simple, por lo que encuentran el código de error muy útil).

Sin embargo, la entrega de la señal no es 100 % inmediata y puede haber casos en los que write() devuelva EPIPE y el proceso continúe ejecutándose durante un breve período de tiempo antes de recibir la señal. En este caso, type obtiene tiempo suficiente para notar la escritura fallida, traducir el código de error e incluso imprimir un mensaje de error en stderr antes de que SIGPIPE lo elimine. (El mensaje de error dice “-bash: tipo:” ya que type es un comando integrado de bash en sí mismo.)

Esto parece ser más común en sistemas multi-CPU, ya que el type El proceso y el código de entrega de señales del kernel pueden ejecutarse en diferentes núcleos, literalmente al mismo tiempo.

Sería posible eliminar este mensaje parcheando el type incorporado (en el código fuente de bash) para salir inmediatamente cuando recibe un EPIPE de la función write().

Sin embargo, no es nada de qué preocuparse, y no está relacionado con su rvm instalación de ninguna manera.

Puedes arreglar una tubería rota a expensas de otro proceso insertando tail -n +1 en tu tubería, así:

tipo rvm | cola -n +1 | cabeza -1

Él +1 dice tail para imprimir la primera línea de entrada y todo lo que sigue. La salida será exactamente la misma que si tail -n +1 no estaba allí, pero el programa es lo suficientemente inteligente como para verificar la salida estándar y cierra la tubería limpiamente. No más tuberías rotas.

Él write error: Broken pipe El mensaje se refiere a un proceso de escritura que intenta escribir en una tubería sin lectores en el extremo de lectura de esa tubería y la circunstancia especial de que el SIGPIPE la señal está configurada para ser ignorada por el proceso actual o el principal. Si fue el proceso principal el que estableció SIGPIPE para ser ignorado, no es posible que el proceso secundario lo deshaga nuevamente en un shell no interactivo.

Sin embargo, es posible matar type rvm cuando head -1 termina usando subcapas explícitas. De esta manera podemos fondo type rvmenviar typepid hacia head -1 subshell y luego implementar una trampa en EXIT ahi para matar type rvm explícitamente.

trap "" PIPE        # parent process sets SIGPIPE to be ignored
bash                # start child process
export LANG=C
# create a fake rvm function
eval "
rvm() 
$(printf 'echo line of rvm code %sn' 1..10000)

"

# rvm is a function
# bash: type: write error: Broken pipe
type rvm | head -1

# kill type rvm when head -1 terminates
# sleep 0: do nothing but with external command
( (sleep 0; type rvm) & echo $! ; wait $! ) | 
    (trap 'trap - EXIT; kill "$typepid"; exit' EXIT; typepid="$(head -1)"; head -1)

Sección de Reseñas y Valoraciones

Tienes la opción de auxiliar nuestra misión poniendo un comentario y puntuándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *