Как не отображать вывод stdout запущенного процесса?

Когда работающий процесс дает много выходных данных stdout во время его продолжительного процесса, вы не хотите его убивать и повторно запускать. Как вы не можете показать результат? Благодарю.

Один из подходов может заключаться в том, чтобы присоединить отладчик к процессу и заставить его открывать stdout на / dev / null:

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

позвольте мне вырвать здесь решение @jimmij, на которое указывают, с незначительной модификацией.

 (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 ... 

для тех, кто не знаком с gdb, «attach» «call» «detach» – это команды gdb. получить информацию с помощью «help attach» внутри подсказки gdb. и «open» «dup2» «close» – это библиотечные функции. получить информацию с помощью «man 2 open».

здесь O_WRONLY равно 1, а fileno (stdout) равно 1. использовать литеральные значения или gdb, могут жаловаться на отсутствие символов.


и если мы хотим найти уже существующий дескриптор файла, мы можем.

 $ cd /proc/<pid>/fd $ for i in * ; do if [[ `readlink $i` == "/dev/null" ]] fd=$i ; break fi done 

Следующее предотвратит нормальные возвращения, а также сообщения об ошибках

 2&>1 >/dev/null