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"
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.
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"
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
O seguinte evitará retornos normais, bem como mensagens de erro
2&>1 >/dev/null