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

#node.js #linux #shell #process #cc

#node.js #linux #оболочка #процесс #cc

Вопрос:

Я только что закончил приложение для очистки веб-страниц, созданное с помощью puppeteer и node, и на данный момент оно очень нестабильно из-за относительно низкого или нулевого опыта работы с puppeteer (грядут дальнейшие отладки по его сбою). Иногда при запуске нескольких экземпляров этого приложения один из них выходит из строя, и этот процесс узла не завершается, и он будет работать вечно или пока я не убью его вручную.

Я использую: ps -e | grep node для обнаружения всех процессов узла и: pkill -f node для уничтожения каждого процесса. Немного покопавшись, я обнаружил следующее: ps -eo pid,comm,lstart,etime,time,args , который возвращает каждый процесс Linux. time Параметр возвращает прошедшее время процесса. Теперь мой вопрос таков: есть ли способ уничтожить только те узловые процессы, для которых затраченное время превышает 5 минут?

Обычный запуск скрипта puppeteer обычно выполняет свою работу примерно за 3-4 минуты, в зависимости от объема информации, которую он должен очистить.

Пожалуйста, пожалуйста, помогите! Спасибо!

Ответ №1:

Итак … наращивание вашего ps вызова:

 ps -eo pid,comm,lstart,etime,time,args | awk '$10~/node/{split($8,a,/[-:]/);min=a[length(a)-1];if(min>=5){print $1}}' |xargs -i echo "kill "{}
 

Вы можете использовать awk для выполнения некоторой постобработки.

Если 10-е поле содержит слово node, разделите etime его на массив a на основе разделителей [-:] ; предпоследним элементом всегда будут минуты. Если от 2-го до последнего элемента >= 5, выведите соответствующий PID. Обработайте вывод awk с помощью xargs… Я повторяю «kill» и pid, потому что я не хотел убивать случайные процессы в своем тестировании.

Если результат теста выглядит нормально, измените xargs -i echo "kill "{} на xargs -i kill {}

Комментарии:

1. Я попробую это завтра на работе и вернусь с ответом. Спасибо за ответ!

2. Извините за поздний ответ. Это отлично работает. Спасибо за помощь!