#linux #bash #filter
#linux #bash #Фильтр
Вопрос:
Я пытаюсь добавить команды фильтра в top для неинтерактивного использования. При использовании top можно задавать фильтры в интерактивном режиме, например
$ top
Type: o
Enter: COMMAND=MyProcess
будут показаны только те процессы, в команде которых есть «MyProcss».
Кроме того, настройки отображения top можно сохранить в файл с помощью «W» из командной строки в $HOME /.toprc. Затем, когда top запустится снова, он будет использовать эти настройки отображения вместо настроек по умолчанию.
Но, похоже, что фильтры, которые добавляются через «COMMAND = …», не сохраняются в файле .toprc. Итак, возможно ли добавить эти фильтры через командную строку, чтобы top мог выводить данные неинтерактивно? Я не могу использовать опцию top «-p» для отображения данных из определенных PID, поскольку у меня есть более 20 PID, которые необходимо отслеживать, и они могут быть добавлены после вызова top. Кроме того, я не хочу выводить данные для всех 900 процессов, запущенных на моем компьютере.
Наконец, я действительно не хочу просто grep имена процессов, так как я хочу заголовок top, а также.
В идеале псевдокоманда должна быть такой, но это не работает:
top -b -o 'COMMAND=MyProcess' -o '!COMMAND=NotThisProcess'
Ответ №1:
Согласно моей top
справочной странице, -o
это только для порядка сортировки. Я не вижу параметров командной строки для указания «другого» фильтра. И -b
опция исключает чтение пользовательского ввода для ввода фильтра.
Предполагая, что ваш top
похож на мой, есть 7 строк заголовков. Итак, если вы хотите видеть только процессы «myProcess», вы можете сделать это:
top -b -n 1 | sed '8,$ {/MyProcess/! d}'
Это означает, что начиная со строк 8 и до конца, удалите любую строку, которая не содержит myProcess.
Комментарии:
1. OP ссылался на интерактивную команду «o», которая отличается от аргумента команды -o. Интерактивная команда «o» называется «Другой фильтр». Решение sed здесь также отсутствует, поскольку OP говорит, что им нужно «отслеживание» процессов, а не просто мгновенный снимок.
2. @KevinRak что касается проблемы с отслеживанием, есть возможность использовать
watch
для мониторинга
Ответ №2:
Какую лучшую версию вы используете ( top -v
)? Это важно, поскольку в некоторых версиях указано, что «активные «другие фильтры»» сохраняются в файле ЛИЧНОЙ конфигурации, в то время как в других этого не делается. Например, сравните главную справочную страницу на man7.org против того, что на manpages.ubuntu.com
Для меня top -v
возвращает procps-ng 3.3.12
Просматривая репозиторий procps-ng, я вижу, что была проблема с добавлением поддержки для этого. Эта проблема была решена, и была добавлена поддержка сохранения других фильтров в файл конфигурации, которая доступна в версии 3.16
Итак, для моей среды обновление top до 3.3.16 дало бы мне функцию конфигурации, которую вы ищете. Очевидно, что ваша среда может отличаться.
При этом я не нашел никакого способа передать это в качестве аргумента команды. Но с некоторыми сценариями оболочки и манипуляциями sed с файлом конфигурации это можно было бы обработать.
Ответ №3:
Я использую инструмент «ожидать» для запуска «top», ввода команд фильтрации, затем позволяю top продолжать работать в обычном режиме.
#!/usr/bin/env expect
spawn top
expect "COMMAND"
send "O"
expect "add filter"
send "COMMAND=MyProcessn"
interact
При использовании expect вы обычно должны дождаться некоторого ожидаемого результата перед отправкой следующих нажатий клавиш. Я выбрал КОМАНДУ из заголовков top, чтобы дождаться запуска top, и «добавить фильтр» после отправки «O», чтобы убедиться, что top готов к строке фильтрации. Команда «interact» сообщает, что ожидайте продолжения выполнения команды и передачи всего ввода / вывода без изменений до завершения работы команды.
Expect — это интерпретатор tcl, поэтому вы могли бы добавить поддержку передачи аргументов командной строки в команду top при поиске дополнительных аргументов фильтрации и преобразовании их в последовательности ожидания / отправки. В моем варианте использования была фиксированная команда, и мне не нужны были дополнительные опции для top, поэтому мне был нужен жестко запрограммированный сценарий ожидания.