2015-12-01 2 views
4

Я обычно запускаю много программ из той же оболочки, прежде чем использовать команду watch для мониторинга программ для завершения. (Отфильтровать команду рз немного, но этот пример проще.)Очистить экран в команде «watch»

sleep 10 && for i in {1..100}; do echo $i; done & 
watch -n 5 ps aux 

Команда часов очищает терминал, так что вывод команды ясно и нет помех.

Output of watch command

когда другая программа выводит такие как эхо-операторы в примере, то результат будет немного странно. Он печатает странно, и результаты, похоже, зависят от размера вывода. Несмотря на то, что часы должны перезапустить команду «ps aux», она не перезаписывает выходные данные команд «эхо».

After sleep timer has finished

Есть ли что-то подобное, что бы предотвратить выход других программ от покрытия выход часы?

watch -n 5 ClearScreenSomehow && ps aux 
+0

Как написано, эта проблема не воспроизводится, поэтому вам трудно помочь. Вам нужно будет добавить примерную программу, которая воспроизводит нежелательное поведение. – merlin2011

+0

Отдельное примечание: почему ваш бинарный файл имеет расширение exe для Linux? Это не больно, но это кажется немного странным и ненужным. – merlin2011

+0

@ merlin2011 Я изменил команды, чтобы сделать это, чтобы вы могли легко повторить проблему на своем собственном терминале. Я предполагаю, что это обычная вещь. –

ответ

2

Я не знаю, если есть простой способ сделать это. Пока кто-то приходит с одним, вот сложный способ сделать это:

Рассмотрим оригинальный случай как контроль:

#delayed print to clutter up watch later 
bash -c 'sleep 10; echo ASDF' & 
#watch dummy command, observe cluttering 
watch -n1 'ls -la |head -25' 

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

Стандартный способ перенаправления вывода уже запущенных процессов - using gdb. Чтобы сделать это неинтерактивно, вы должны использовать the -batch switch и ручную спецификацию pid, которую вы хотите перенаправить. В результате

bash -c 'sleep 10; echo ASDF' & 
#sudo gdb -p "$!" -batch -ex 'p dup2(open("/dev/null",0),1)' -ex 'p dup2(open("/dev/null",0),2)' -ex 'detach' 
gdb -p "$!" -batch -ex 'p dup2(open("/dev/null",0),1)' -ex 'p dup2(open("/dev/null",0),2)' -ex 'detach' 
watch -n1 'ls -la |head -25' 

$!, где это pid последнего порожденного процесса, который является именно то, что нам нужно в нашем примере. В вашем фактическом варианте использования вам нужно будет loop over every pid running in the background вашей данной оболочки и заменить каждый pid на $! выше.

Также обратите внимание, что вызов gdb должен работать без sudo для ваших собственных процессов, но по какой-либо причине (из некоторой конфигурации) он позволяет мне выполнять его только с sudo. Ваш пробег может отличаться.

1

Простым и очевидным ответом является не выполнение фоновых команд, которые могут выдавать выходные данные без перенаправления.

Когда вы запускаете что-то в фоновом режиме, распечатайте его в файл. Изучите файл, когда хотите просмотреть результат.

Некоторые люди также любят использовать screen или tmux для выполнения отдельных заданий в отдельных виртуальных терминалах. Или просто откройте отдельный xterm или похожий для каждого процесса, который вы хотите запустить, делая что-то еще.

+0

Обычно, если я разрешаю что-то печатать в std, это намеренно. Может быть, я смотрю вывод, чтобы увидеть, проходит ли программа до того момента, когда она разбилась раньше, и тогда ее можно оставить и вернуться позже. В других случаях я не ожидал сообщений об ошибках печати, таких как моя IDE. Полагаю, я мог бы добавить «>/dev/null» ко всем этим вызовам, но это несколько утомительно. –