Вопрос или проблема
Я пишу этот простой скрипт, который преобразуется в демон и работает в фоновом режиме. Задача скрипта проста. Он должен отслеживать процесс типа команды 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 &
- Нагрузка на систему: Бесконечный цикл с проверкой каждые несколько миллисекунд может перегружать процессор, особенно если программа выполняется долго.
- Пропуск короткоживущих процессов: Возможно,
ls
или другие процессы завершатся очень быстро, и вы не увидите их выполнение. - Неэффективное использование
grep
: Ваша команда используетps
иgrep
, что может быть не самым оптимальным способом.
Альтернативный подход
Для оптимизации мы можем использовать конструкцию sleep
, чтобы снизить частоту проверок, а также использовать более эффективные методы поиска процессов. Например:
while sleep 5
do
ps -ef | grep -w '[l]s' >> matched.txt
done &
Объяснения изменений:
- Пауза между проверками: Использование
sleep
позволяет запланировать паузу на 5 секунд между проверками, что значительно снижает загрузку ЦП. - Шаблон регулярного выражения: Шаблон
'[l]s'
позволяет избежать проблемы с тем, что командаgrep
сама же будет отображаться в результатах.
Использование системных утилит
Если вам нужно просто отслеживать запущенные процессы, вам могут помочь более продвинутые инструменты:
-
pgrep
: Это команда, специально предназначенная для поиска процессов по имени. -
/proc
файловая система: Доступ к информации о процессах в/proc
может быть гораздо эффективнее. Вы можете использовать:grep 'ls' /proc/*/comm
-
Аудит и логирование: Использование
lastcomm
или других инструментов для аудита может обеспечить более надежный способ отслеживания процессов без постоянных циклических проверок.
Рекомендации
Если вашей целью является не только мониторинг, но и автоматическое восстановление процесса при его завершении:
-
Рассмотрите возможность использования systemd для управления процессами. Вы можете создать юнит-файл, который будет автоматически перезапускать ваш процесс в случае его завершения.
-
Если вам нужно просто записывать начало и конец выполнения процессов, подумайте о использовании утилиты для аудита, что обеспечит более точную и надежную информацию.
Заключение
Создание скрипта для мониторинга процессов — это интересная, но более сложная задача, чем кажется на первый взгляд. Использование оптимизированных методов, таких как pgrep
, lastcomm
, или инфраструктуры системного менеджмента, позволит создать более эффективное и надёжное решение. Ваше здоровье компьютера и производительность системы — это важные аспекты, которые нужно учитывать при проектировании таких решений.