Как постоянно регистрировать изменения процессов в системе Linux с использованием встроенных инструментов?

Вопрос или проблема

У меня есть доступ root к системе Linux, и мне нужно регистрировать процессы, не устанавливая дополнительное программное обеспечение, используя только встроенные инструменты, такие как top. Однако я хочу, чтобы процесс работал в фоновом режиме непрерывно, пока я его не остановлю вручную, в отличие от top, который показывает только данные в реальном времени.

Вот что мне нужно:

  1. Когда команда выполняется, она должна захватить начальное состояние всех запущенных процессов.

  2. Если возникает новый процесс или существующий процесс завершает работу, журнал должен фиксировать временную метку, команду и информацию о пользователе для этих изменений.

  3. Когда я прекращаю регистрацию, он также должен записать конечное состояние процессов в тот момент.

Как я могу это сделать, используя встроенные инструменты 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: Сохранение и выполнение скрипта

  1. Сохраните указанный скрипт в файл, например, process_logger.sh.

  2. Дайте ему права на выполнение:

    chmod +x process_logger.sh
  3. Запустите скрипт:

    ./process_logger.sh

Шаг 3: Остановка логирования

  • Чтобы остановить логирование, просто нажмите Ctrl+C. При этом будет зафиксировано финальное состояние процессов, и скрипт завершит свою работу.

Формат лога

Лог будет выглядеть примерно так:

2023-10-01 12:00:00 Состояние процессов зафиксировано.
[2023-10-01 12:00:01] Изменение процессов: 
8 root       /sbin/init
...

Каждый раз, когда процесс запускается или завершает свою работу, изменения будут добавлены в лог-файл.

Примечания

  • Убедитесь, что у вас есть достаточные права для выполнения всех команд.
  • Вы можете настроить задержку между проверками, изменив значение в sleep 1.
  • Этот скрипт реализует простейшую логику для отслеживания изменений, и в зависимости от вашей системы могут потребоваться дополнительные модификации для обработки специфических требований.
Оцените материал
Добавить комментарий

Капча загружается...