Скажем, я хочу отслеживать использование памяти в процессе Java в одночасье.
Я могу сделать что-то вроде
наверх | grep java> out.log
Я получу лог-файл с кучей строк.
Есть ли простой способ вставить данные / время перед каждой строкой?
Не изобретайте велосипед. Записывать сообщения в системный журнал, используя регистратор (1), который поддерживается практически всеми версиями Unix. Системный журнал позаботится о временных метках за вас. Данные вашего журнала будут храниться в системном журнале, например /var/log/messages
(Это можно настроить). Вам не нужно беспокоиться об очистке файлов журналов позже (особенно, если это задание выполняется постоянно), потому что системные журналы автоматически меняются с помощью logrotate / newsyslog.
top | grep java | logger -t java_cpuhog
Или, если вы действительно хотите записать его в свой собственный файл. Но потом вам нужно очистить файл:
top | grep java | logger -t java_cpuhog -f /var/log/java-top.log
... | awk -f timetag.awk > ...
timetag.awk:
{
print "[" strftime() "] " $0
}
В ракушке: top | grep java | while read LINE ; do date "+%F %T ${LINE}" ; done
Вы могли бы создать что-то вроде stamp
содержащий
#!/usr/bin/perl -p
s/^/localtime()." "/e;
Тогда беги
top -b | grep java | stamp > out.log
Не забывайте использовать top -b
если вы не используете его в интерактивном режиме. Конечно, top уже ставит отметку времени при каждом запуске. Если вам не обязательно нужна дата в каждой строке, просто используйте вершину отдельно, поскольку она ставит отметку времени на каждой итерации. Я иногда использую это, чтобы получить 10-секундные образцы на целый день, чтобы просмотреть их позже:
top -b -d 10 -c -n 8640