Подтвердить что ты не робот

Как захватить вывод верхней команды в файле в linux?

Я хочу записать вывод определенной "верхней" команды в файл. Я немного погуглил и выяснил, что это можно сделать с помощью следующей команды.

top -n 10 -b > top-output.txt

где -n указывает количество итераций, а -b для пакетного режима. Это работает очень хорошо, если позволить top для 10 итераций. Но если я прерву выполнение команды с помощью Ctrl-C, выходной файл окажется пустым.

Я не буду знать количество итераций заранее, поэтому мне нужно разбить его вручную. Как мне записать вывод top в файл без указания итераций?

Команда, которую я пытаюсь использовать точно, это

top -b | grep init > top-output.txt

и разбей его, когда захочу. Но это не работает.

ОБНОВЛЕНИЕ: Чтобы дать больше контекста к вопросу, у меня есть Java-код, который вызывает инструмент с входным файлом. Как в инструменте принимает файл в качестве входных данных и работает в течение некоторого времени, затем принимает следующий файл и так далее. У меня есть набор из 100 000 файлов, которые необходимо подать в инструмент. Поэтому сейчас я пытаюсь отслеживать этот конкретный инструмент (он работает как процесс в Linux). Я не могу захватить все верхние данные как файл, который был бы слишком большим с нежелательными данными. Как получить системную статистику только этого процесса и записать ее в файл, используя top?

4b9b3361

Ответ 1

для меня top -b > test.txt сохранит весь вывод из top ok, даже если я сломаю его с помощью ctrl-c. Я предлагаю вам сначала сбрасывать, а затем grep результирующий файл.

Ответ 2

Как насчет использования цикла while и -n 1:

while sleep 3; do 
  top -b -n1 | grep init > top-output.txt
done

Ответ 3

Похоже, что вывод не записывается в файл до тех пор, пока все итерации не будут завершены. Вы можете решить эту проблему, обернув внешним циклом:

touch top-output.txt
while true; do
    top -b | grep init >> top-output.txt
done

Ответ 4

Вот 1-лайнер, который мне нравится использовать на моем mac:

top -o -pid -l 1 | grep "some regexp"

Приветствия.

Ответ 5

CTRL + C - не идеальное решение из-за контроля в CLI. Вы можете использовать команду ниже, которая выводит верхний вывод в файл:

top -n 1 -b > top-output.txt

Ответ 6

У меня была такая же проблема...

здесь была моя строка:

top -b -u myUser | grep -v Prog.sh | grep Prog > myFile.txt

Он создал бы файл myFile.txt, но он был бы пуст, когда я нажму Ctrl + C'd. Поэтому после того, как я выпустил свою верхнюю команду, я начал второй раунд. Когда я нашел первый верхний PID (взял проб и ошибок), и я убил его через вторую вершину, первый верх написал в файл, как ожидалось.

Надеюсь, что это поможет!

Ответ 7

Если вы хотите запустить верхнюю команду в фоновом режиме (просто не беспокоиться о выходе/спящем режиме и т.д.), вы можете использовать nohup или пакетное задание или cron или screen.

Использование nohup (означает: Hang Up):

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

 top -p <PID> -b > /tmp/top.log

Вы можете заменить верхнюю команду на любой интересующий вас процесс. Затем вы можете выполнить top-exec.sh с помощью nohup следующим образом:

$> nohup top-exec.sh &

Это перенаправляет весь вывод команды top в файл с именем "top.log" .

Ответ 8

Решил эту проблему. Это работает, даже если вы нажмете Ctrl + c. Даже я столкнулся с той же проблемой, когда мне захотелось зарегистрировать Cpu%. Выполните эту оболочку script:

#!/bin/sh
while true; do
    echo "$(top -b -n 1 | grep init)"  | tee -a top-output.log
    sleep 1
done
  • Вы можете grep все, что вы хотите извлечь из верхней команды, используйте этот script, чтобы сохранить его в файле.
  • -b: Режим пакетного режима      Начинается сверху в пакетном режиме, что может быть полезно для отправки вывода сверху на другие программы или       в файл. В этом режиме top не будет принимать входные данные и будет работать до тех пор, пока не будет установлен лимит итераций       с параметром командной строки -n или до тех пор, пока не будет убит.
  • -n number, этот параметр указывает максимальное количество итераций или кадров, верхние должны выдавать до окончания. Здесь я использовал -n 1.
  • Подробнее о man top
  • tee -a позволяет выводить вывод на консоль, а также сохраняет вывод в файл. -a добавляет вывод в файл.
  • Здесь я дал интервал в 1 секунду. Вы можете указать любой другой интервал.

Источник для объяснений -b и -n: manpages

man top

Kruthika

Ответ 9

Как отметил @Thor в комментарии, вам просто нужно убедиться, что grep не буферизует произвольно, а в отдельной строке с опцией --line-buffered:

top -bn 10 | grep 'init' --line-buffered | tee top-output.txt

Без grep-перенаправления перенаправление вывода top в файл работает нормально, включая прерывания.

Ответ 10

В верхней команде мы видим все процессы с их идентификатором (идентификатором процесса). Чтобы распечатать верхний вывод только для одного процесса, используйте следующую команду:

$ top –p PID

Чтобы сохранить верхнюю команду любого процесса в файле, используйте следующую команду:

top -p $PROCESS_ID -b  > top.log

где > перенаправляет стандартный вывод в файл.