Лучший язык / метод для возрождения зависших процессов в Ubuntu? - PullRequest
3 голосов
/ 05 октября 2011

У меня есть сервер Ubuntu Oneiric, который запускает несколько экземпляров ffmpeg (каждый транскодирует прямую трансляцию видео).Время от времени один из экземпляров ffmpeg будет зависать.Под «зависанием» я подразумеваю, что процесс не заканчивается, он просто сидит и ничего не делает.Я использую Upstart для автоматического перезапуска процессов, которые аварийно завершают работу, и это нормально, но не определяет, когда процесс завис.

В CLI я легко могу определить, какой процесс завис, используя "ps axo pid", pcpu, comm | grep ffmpeg ".Для не зависших процессов значение pcpu будет> 200, а для зависшего - 100 (или очень близко к нему).В этом сценарии мне просто нужно убить зависший процесс, и Upstart включается и вызывает его заново.

Я довольно новичок в Linux, поэтому мой вопрос: какая технология / язык лучше всего подходит для автоматизации этого?Я думаю, что мне нужно сделать, это проанализировать вывод ps, чтобы найти экземпляры с pcpu около 100, а затем убить эти экземпляры.

Спасибо.

F

Ответы [ 2 ]

1 голос
/ 05 октября 2011

в ответ на user980473 Я бы, вероятно, также использовал awk, но вместо того, чтобы просто вернуть PID, я бы вызвал свою команду и передал ее bash.Хотя я бы удалил grep и просто использовал awk и переместил условный оператор в фигурные скобки.

ps axo pid,comm,pcpu| awk '/ffmpeg/ {if ($3 <= 15.0 && $3 >= 10.0) print "kill -9 "$1}' | bash

заметил, что мое условное выражение немного более изящно.поскольку user980473 также будет печатать PID больше 10.0.Кажется, рабочие процессы ffmpeg составляют около 20%?Вы не хотели бы убивать их.мое выглядит на уровне 10-15%, но это может быть легко уточнено больше.Вы заметили, что awk будет печатать kill -9 $ 1 на стандартный вывод, но с помощью канала для bash эти вызовы будут «горячими».

Я незнаком с upstart, но вы можете больше команд.Возможно, вам нужно вызвать локальный скрипт на python, после чего команда будет выглядеть практически так же, но после $ 1 у вас будет "; ./rebootScript.py"

или

ps axo pid,comm,pcpu| awk '/ffmpeg/ {if ($3 <= 15.0 && $3 >= 10.0) print "kill -9 "$"; ./rebootScript.py"}'

так что, чем спрашивает, как бы вы это сделали?Сидеть за CLI и печатать это каждые 5 минут - это нереально.это где я бы создал работу cron.

сохранить этот файл как скрипт bash

#!/bin/bash

ps axo pid,comm,pcpu| awk '/ffmpeg/ {if ($3 <= 15.0 && $3 >= 10.0) print "kill -9 "$1}' | bash

ДАЛЕЕ, установить правильные разрешения.sudo chmod +x ./ffmpegCheck.sh

и переместите скрипт туда, где вы хотели бы его сохранить.Я поместил бы мой в mv ffmpegCheck.sh /usr/local/bin/ffmpegcheck

, это позволило бы мне вызвать его, просто вызвав ffmpegcheck

crontab -l или sudo crontab -l для root, чтобы отобразить текущий файл cron ..

это должно выглядеть примерно так:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

, вы захотите добавить запись в список.Я бы набрал sudo crontab -e, но есть и другие способы.и добавьте */3 * * * * /usr/local/bin/ffmpegcheck # ffmpeg check

, при этом скрипт будет запускаться каждые 3 минуты.Это можно настроить несколько.Удачи.

1 голос
/ 05 октября 2011

Я не знаю, является ли это лучшей технологией / языком, но awk будет работать, например,

$ ps axo pid,comm,pcpu | awk '/ffmpeg/ {if ($3 >= 10.0) print $1}'

даст вам PID всех процессов ffmpeg, использующих более 10% ЦП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...