Ответ 1
для меня top -b > test.txt
сохранит весь вывод из top
ok, даже если я сломаю его с помощью ctrl-c
. Я предлагаю вам сначала сбрасывать, а затем grep
результирующий файл.
Я хочу записать вывод определенной "верхней" команды в файл. Я немного погуглил и выяснил, что это можно сделать с помощью следующей команды.
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?
для меня top -b > test.txt
сохранит весь вывод из top
ok, даже если я сломаю его с помощью ctrl-c
. Я предлагаю вам сначала сбрасывать, а затем grep
результирующий файл.
Как насчет использования цикла while
и -n 1
:
while sleep 3; do
top -b -n1 | grep init > top-output.txt
done
Похоже, что вывод не записывается в файл до тех пор, пока все итерации не будут завершены. Вы можете решить эту проблему, обернув внешним циклом:
touch top-output.txt
while true; do
top -b | grep init >> top-output.txt
done
Вот 1-лайнер, который мне нравится использовать на моем mac:
top -o -pid -l 1 | grep "some regexp"
Приветствия.
CTRL + C - не идеальное решение из-за контроля в CLI. Вы можете использовать команду ниже, которая выводит верхний вывод в файл:
top -n 1 -b > top-output.txt
У меня была такая же проблема...
здесь была моя строка:
top -b -u myUser | grep -v Prog.sh | grep Prog > myFile.txt
Он создал бы файл myFile.txt, но он был бы пуст, когда я нажму Ctrl + C'd. Поэтому после того, как я выпустил свою верхнюю команду, я начал второй раунд. Когда я нашел первый верхний PID (взял проб и ошибок), и я убил его через вторую вершину, первый верх написал в файл, как ожидалось.
Надеюсь, что это поможет!
Если вы хотите запустить верхнюю команду в фоновом режиме (просто не беспокоиться о выходе/спящем режиме и т.д.), вы можете использовать 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" .
Решил эту проблему. Это работает, даже если вы нажмете Ctrl + c. Даже я столкнулся с той же проблемой, когда мне захотелось зарегистрировать Cpu%. Выполните эту оболочку script:
#!/bin/sh
while true; do
echo "$(top -b -n 1 | grep init)" | tee -a top-output.log
sleep 1
done
man top
Источник для объяснений -b и -n: manpages
man top
Kruthika
Как отметил @Thor в комментарии, вам просто нужно убедиться, что grep
не буферизует произвольно, а в отдельной строке с опцией --line-buffered
:
top -bn 10 | grep 'init' --line-buffered | tee top-output.txt
Без grep-перенаправления перенаправление вывода top
в файл работает нормально, включая прерывания.
В верхней команде мы видим все процессы с их идентификатором (идентификатором процесса). Чтобы распечатать верхний вывод только для одного процесса, используйте следующую команду:
$ top –p PID
Чтобы сохранить верхнюю команду любого процесса в файле, используйте следующую команду:
top -p $PROCESS_ID -b > top.log
где > перенаправляет стандартный вывод в файл.