Como não mostrar a saída stdout de um processo em execução?

4

Quando um processo em execução fornece muitas saídas stdout durante todo o processo de execução demorado, você não quer eliminá-lo e executá-lo novamente. Como você pode não mostrar a saída? Obrigado.

    
por Tim 24.02.2015 / 23:06

3 respostas

4

Uma abordagem poderia ser anexar um depurador ao processo e torná-lo aberto em / dev / null:

gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"
    
por 24.02.2015 / 23:23
1

deixe-me arrancar aqui a solução que @jimmij apontou, com pequenas modificações.

(gdb) attach <pid>    
... 
(gdb) call open("/dev/null",O_WRONLY)
$1 = 3
(gdb) call dup2($1,fileno(stdout))
$2 = 1
(gdb) call close($1)
...
(gdb) detach
...

para quem não está familiarizado com o gdb, "attach" "call" "detach" são comandos do gdb. obter informações com "ajuda anexar" dentro de um prompt do gdb. e "open" "dup2" "close" são funções da biblioteca. obter informações com "man 2 open".

aqui O_WRONLY é igual a 1 e fileno (stdout) é igual a 1. use valores literais ou o gdb pode reclamar da falta de símbolos.

e se quisermos encontrar um descritor de arquivos já aberto, nós podemos.

$ cd /proc/<pid>/fd
$ for i in * ; do
          if [[ 'readlink $i' == "/dev/null" ]]
                  fd=$i ; break
          fi
  done
    
por 25.02.2015 / 06:22
-1

O seguinte evitará retornos normais, bem como mensagens de erro

2&>1 >/dev/null
    
por 25.02.2015 / 02:50