#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. Извините за поздний ответ. Это отлично работает. Спасибо за помощь!