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 oTCSETSWioctl . O programalesstenta 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
TCGETSioctl sem ser interrompido - veja a listagem acima.) - Se um processo em segundo plano tentar gravar no terminal e o terminal tiver o sinalizador
tostopdefinido, 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.