Vamos ver mais de perto o que está acontecendo com 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 ---
O controle de trabalho restringe os processos em um trabalho em segundo plano de executar determinadas operações no terminal de controle.
- Se um processo em segundo plano tentar ler a partir do terminal, será enviado um sinal
SIGTTIN
, que normalmente interrompe (pausa) o processo. -
Se um processo em segundo plano tentar definir os parâmetros de um terminal, será enviado um sinal
SIGTTOU
, que também normalmente interrompe o processo. Isso é o que está acontecendo aqui com oTCSETSW
ioctl . O programaless
tenta colocar o terminal em modo raw logo depois de iniciado, mesmo antes de saber se tem algo para exibir.Há uma boa razão para isso: você não deseja que um trabalho em segundo plano altere assincronamente seu terminal para que, por exemplo, o modo bruto esteja ativado e o eco esteja desativado. (Um processo em segundo plano pode obter parâmetros do terminal com
TCGETS
ioctl sem ser interrompido - veja a listagem acima.) - Se um processo em segundo plano tentar gravar no terminal e o terminal tiver o sinalizador
tostop
definido, será enviado o sinalSIGTTOU
.
Você provavelmente não tem o sinalizador tostop
definido (execute stty -a
para verificar). Se você não fizer isso, um comando de fundo como pdfgrep -R -i spark . &
que não altera as configurações do terminal poderá gravar no seu terminal sempre que ele tentar.
Você também escreveu:
The reason that I pipe to less is because I don't want the output to stdout messes up the screen of my terminal session when I am doing something else
O programa menos vai enviar a saída para o terminal, uma tela por vez. Se você executar stty tostop
antes de pdfgrep | less &
ou antes de pdfgrep &
, eles só irão enviar para o seu terminal quando estiverem em primeiro plano.