Bash скрипт – Необходимо мониторить какой-то процесс в системе Linux

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

Я пишу этот простой скрипт, который преобразуется в демон и работает в фоновом режиме. Задача скрипта проста. Он должен отслеживать процесс типа команды ls и записывать это в файл для учета.

Мой подход заключается в том, чтобы просто иметь бесконечный цикл, который постоянно проверяет наличие процесса с помощью команды ps. И если он его обнаружит, он добавит его в файл.

Мне интересно, не является ли это плохим подходом для написания этого.

Мой код выглядит следующим образом:

while true
do 
   if [[ $(ps -aux | grep -w "ls") ]]
   then 
       #добавить в файл
   fi 
done &

Вы можете

grep commandname /proc/*/comm

что, на моей системе Linux, в 2 – 3 раза быстрее, чем ps | grep или pgrep.

Вы предлагаете:

Мой подход заключается в том, чтобы просто иметь бесконечный цикл, который постоянно проверяет наличие процесса с помощью команды ps. И если он его обнаружит, он добавит его в файл.

Если вы собираетесь это сделать, просто ищите имя процесса и добавляйте любые совпадения. (Если совпадений нет, ничего не будет выведено.)

while sleep 5
do
    ps -ef | grep -w '[l]s' >> matched.txt
done

Не зная, чего вы действительно хотите достичь, трудно критиковать ваш подход. Если вы просто хотите перезапустить процесс, если он исчезнет, подумайте о том, чтобы использовать единицу systemd. Если вы хотите зафиксировать существование процесса, вам, возможно, лучше использовать lastcomm или другой инструмент аудита, чтобы зафиксировать время начала и окончания указанного процесса. В обоих случаях вы можете избавиться от вашей занятый цикла и не потеряете никакого временного выполнения процессов.

Ответ или решение

Как создать скрипт на Bash для мониторинга процессов в Linux

В данной статье мы обсудим, как создать эффективный Bash-скрипт для мониторинга запущенного процесса в системе Linux и документирования его в файл. Мы рассмотрим предложенный вами подход, предложим улучшения и альтернативные методы, которые могут повысить эффективность вашего решения.

Описание проблемы

Вы хотите monitorить процесс, например, команду ls, чтобы фиксировать его выполнение в файл. Ваш первоначальный подход включает бесконечный цикл с использованием команды ps для проверки наличия указанного процесса. Хотя Ваш метод имеет свои достоинства, есть способы его оптимизации.

Проблемы исходного подхода

Ваш код имеет следующий вид:

while true
do 
   if [[ $(ps -aux | grep -w "ls") ]]
   then 
       #append to file
   fi 
done &
  1. Нагрузка на систему: Бесконечный цикл с проверкой каждые несколько миллисекунд может перегружать процессор, особенно если программа выполняется долго.
  2. Пропуск короткоживущих процессов: Возможно, ls или другие процессы завершатся очень быстро, и вы не увидите их выполнение.
  3. Неэффективное использование grep: Ваша команда использует ps и grep, что может быть не самым оптимальным способом.

Альтернативный подход

Для оптимизации мы можем использовать конструкцию sleep, чтобы снизить частоту проверок, а также использовать более эффективные методы поиска процессов. Например:

while sleep 5
do
    ps -ef | grep -w '[l]s' >> matched.txt
done &
Объяснения изменений:
  • Пауза между проверками: Использование sleep позволяет запланировать паузу на 5 секунд между проверками, что значительно снижает загрузку ЦП.
  • Шаблон регулярного выражения: Шаблон '[l]s' позволяет избежать проблемы с тем, что команда grep сама же будет отображаться в результатах.

Использование системных утилит

Если вам нужно просто отслеживать запущенные процессы, вам могут помочь более продвинутые инструменты:

  1. pgrep: Это команда, специально предназначенная для поиска процессов по имени.

  2. /proc файловая система: Доступ к информации о процессах в /proc может быть гораздо эффективнее. Вы можете использовать:

    grep 'ls' /proc/*/comm
  3. Аудит и логирование: Использование lastcomm или других инструментов для аудита может обеспечить более надежный способ отслеживания процессов без постоянных циклических проверок.

Рекомендации

Если вашей целью является не только мониторинг, но и автоматическое восстановление процесса при его завершении:

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

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

Заключение

Создание скрипта для мониторинга процессов — это интересная, но более сложная задача, чем кажется на первый взгляд. Использование оптимизированных методов, таких как pgrep, lastcomm, или инфраструктуры системного менеджмента, позволит создать более эффективное и надёжное решение. Ваше здоровье компьютера и производительность системы — это важные аспекты, которые нужно учитывать при проектировании таких решений.

Оцените материал
Добавить комментарий

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