Вопрос или проблема
У меня есть доступ root к системе Linux, и мне нужно регистрировать процессы, не устанавливая дополнительное программное обеспечение, используя только встроенные инструменты, такие как top. Однако я хочу, чтобы процесс работал в фоновом режиме непрерывно, пока я его не остановлю вручную, в отличие от top, который показывает только данные в реальном времени.
Вот что мне нужно:
-
Когда команда выполняется, она должна захватить начальное состояние всех запущенных процессов.
-
Если возникает новый процесс или существующий процесс завершает работу, журнал должен фиксировать временную метку, команду и информацию о пользователе для этих изменений.
-
Когда я прекращаю регистрацию, он также должен записать конечное состояние процессов в тот момент.
Как я могу это сделать, используя встроенные инструменты Linux?
Ответ или решение
Для того чтобы непрерывно логировать изменения процессов на системе Linux, используя только встроенные инструменты, вы можете использовать комбинацию команд ps
, awk
, и date
. Ниже представлено подробное руководство, как это сделать:
Шаг 1: Создание скрипта для логирования
Создайте bash-скрипт, который будет выполнять необходимые действия:
#!/bin/bash
LOGFILE="process_log.txt"
# Функция для логирования состояния процессов
log_processes() {
# Получаем текущее время
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
# Логируем процессы
ps -eo pid,comm,user --sort=user >> "$LOGFILE"
echo "[$TIMESTAMP] Состояние процессов зафиксировано." >> "$LOGFILE"
}
# Логируем начальное состояние процессов
log_processes
# Функция для отслеживания изменений
track_changes() {
while true; do
# Ждем 1 секунду между проверками (можно изменить по желанию)
sleep 1
# Сравниваем текущее состояние процессов с предыдущим
CURRENT_STATE=$(ps -eo pid,comm,user)
if [ "$CURRENT_STATE" != "$LAST_STATE" ]; then
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$TIMESTAMP] Изменение процессов: " >> "$LOGFILE"
# Поскольку состояние изменено, логируем изменения
diff <(echo "$LAST_STATE") <(echo "$CURRENT_STATE") >> "$LOGFILE"
fi
# Обновляем предыдущее состояние процессов
LAST_STATE="$CURRENT_STATE"
done
}
# Запуск функции отслеживания изменений
track_changes &
# Процесс будет работать в фоновом режиме. Чтобы его остановить, используйте Ctrl+C.
# При остановке, запись конечного состояния
trap "log_processes; echo 'Логирование остановлено.' >> $LOGFILE; exit" SIGINT
Шаг 2: Сохранение и выполнение скрипта
-
Сохраните указанный скрипт в файл, например,
process_logger.sh
. -
Дайте ему права на выполнение:
chmod +x process_logger.sh
-
Запустите скрипт:
./process_logger.sh
Шаг 3: Остановка логирования
- Чтобы остановить логирование, просто нажмите
Ctrl+C
. При этом будет зафиксировано финальное состояние процессов, и скрипт завершит свою работу.
Формат лога
Лог будет выглядеть примерно так:
2023-10-01 12:00:00 Состояние процессов зафиксировано.
[2023-10-01 12:00:01] Изменение процессов:
8 root /sbin/init
...
Каждый раз, когда процесс запускается или завершает свою работу, изменения будут добавлены в лог-файл.
Примечания
- Убедитесь, что у вас есть достаточные права для выполнения всех команд.
- Вы можете настроить задержку между проверками, изменив значение в
sleep 1
. - Этот скрипт реализует простейшую логику для отслеживания изменений, и в зависимости от вашей системы могут потребоваться дополнительные модификации для обработки специфических требований.