¿Por qué un trabajo de background con `| less` ser detenido, mientras que el otro sin él se está ejecutando?

$ pdfgrep -R -i spark . | less & $ pdfgrep -R -i spark . & $ jobs [3]- Stopped pdfgrep -R -i spark . | less [4] Running pdfgrep -R -i spark . & 
  1. ¿Por qué el que con | less | less se detuvo, mientras que el otro sin él se está ejecutando?

    El trabajo parado finalizado no lee de stdin. Entonces esa no puede ser la razón.

  2. La razón por la que hago un seguimiento de los trabajos es porque puedo hacer algo más en la misma session de la terminal.

    La razón por la que canalizo a less es porque no quiero que la salida esté fuera de service en la pantalla de mi session de terminal cuando estoy haciendo otra cosa.

    ¿Hay alguna forma de alcanzar los dos objectives anteriores? Prefiero no save el resultado en un file antes que save el resultado en un file, porque lleva un poco más recordar el file, leerlo y eliminarlo.

Gracias.

Miremos más de cerca lo que le está pasando a less :

 $ pdfgrep -R -i spark . | strace less & [...] open("/dev/tty", O_RDONLY|O_LARGEFILE) = 3 ioctl(3, TCGETS, {B38400 opost isig -icanon -echo ...}) = 0 ioctl(3, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGTTOU {si_signo=SIGTTOU, si_code=SI_KERNEL} --- --- stopped by SIGTTOU --- 

El control de trabajos restringe los processs en un trabajo en segundo plano para realizar ciertas operaciones en el terminal de control.

  • Si un process en segundo plano intenta leer desde el terminal, se enviará una señal SIGTTIN , que generalmente detiene (pausa) el process.
  • Si un process en segundo plano intenta establecer los parameters de un terminal, se enviará una señal SIGTTOU , que también suele detener el process. Eso es lo que está sucediendo aquí con TCSETSW ioctl . El progtwig less intenta poner el terminal en modo raw poco después de que se inicie, incluso antes de saber si tiene algo que mostrar.

    Hay una buena razón para esto: no desea que un trabajo en segundo plano cambie su terminal de forma asincrónica, de modo que, por ejemplo, el modo sin procesar esté activado y el eco desactivado. (Un process en segundo plano puede get los parameters del terminal con TCGETS ioctl sin detenerse; consulte el listdo anterior).

  • Si un process en segundo plano intenta escribir en el terminal y el terminal tiene el indicador de tostop establecido, se le enviará la señal SIGTTOU .

Probablemente no tenga tostop indicador de tostop (ejecutar stty -a para verificar). Si no lo hace, un command de background como pdfgrep -R -i spark . & pdfgrep -R -i spark . & eso no cambia ninguna configuration de terminal podrá escribir en su terminal cada vez que lo intente.

Usted también escribió:

La razón por la que canalizo a less es porque no quiero que la salida esté fuera de service en la pantalla de la session de mi terminal cuando estoy haciendo otra cosa.

El progtwig less finalmente enviará la salida a la terminal, una pantalla por vez. Si ejecuta stty tostop antes de pdfgrep | less & pdfgrep | less & , o antes de pdfgrep & , entonces solo saldrán a su terminal cuando estén en primer plano.

Para responder a su segunda pregunta: utilizo la pantalla (1) para multiplexar muchos commands a través de un dispositivo tipo tty.

  • Página de inicio y manual : es un proyecto de GNU.
  • "10 ejemplos de commands de pantalla para gestionar terminales Linux"

Existe al less una alternativa , tmux (1) y una envoltura simplificadora para ambos, byobu (1).

less está tratando de interactuar con (salida) del TTY, pero dado que se está ejecutando como un trabajo en segundo plano, no tiene TTY para escribir. La utilidad pdfgrep , por otro lado, escribe en salida estándar.

En mi sistema, obtengo el resultado ligeramente más descriptivo

 $ cat ~/.profile | less & [1] 51758 67354 $ [1] + Done cat ~/.profile | Stopped (tty output) less 

En este simple ejemplo, cat termina enviando mi .profile a less , pero less no puede mostrarlo ya que es un trabajo en segundo plano. De ahí el post Stopped (tty output) less .

Sin less , less process todavía se está ejecutando. Solo se detiene temporariamente . Para cambiar a él, use fg %3 (el número corresponde al número de trabajo informado entre corchetes en el post "detenido", y también debería haber sido informado cuando comenzó el trabajo).


Relacionados: arriba, arriba y arriba y commands en Linux