Я написал простой демон, пожалуйста, предложите улучшения (bash / python-Ubuntu) - PullRequest
1 голос
/ 28 января 2011

У меня есть сценарий bash, который в основном запускает аудиопоток с использованием mplayer:

#!/bin/bash
# startmusic.sh
/usr/bin/mplayer http://www.audiostream.com

Я хочу убедиться, что если mplayer завершится с ошибкой или завершится по любой причине, он автоматически перезапустится.Поэтому каждую минуту у меня запускается задание cron, которое также является скриптом bash:

#!/bin/bash
# interval.sh
if [ -z "$(pgrep mplayer)" ]; then
 #restart music
 (
  exec </dev/null
  exec >/dev/null
  exec 2>/dev/null
  umask 0
  cd /
 bash /home/user/startmusic.sh
 ) &
else
 echo "music already playing, no need to restart startmusic.sh"         
fi

Одна странность, которая делает этот скрипт не очень полезным, заключается в том, что mplayer запускает 2 экземпляра, и если игрокостанавливается (как это происходит, например, при потере соединения), выходит только 1 экземпляр mplayer, но остается один.Поскольку мои навыки программирования довольно просты, я был бы очень признателен за любые (простые в реализации) решения.Заранее спасибо / J

1 Ответ

5 голосов
/ 28 января 2011

Как насчет использования бесконечного цикла:

#!/bin/bash
# startmusic.sh
while :; do
    /usr/bin/mplayer http://www.audiostream.com
done

В случае сбоя mplayer он будет просто перезапущен сценарием запуска ad infinitum .

Конечно, это означает, что вам придется сначала убить скрипт запуска, а затем mplayer, если вы когда-нибудь захотите остановить его навсегда.

EDIT:

Простой скрипт, который никогда не завершится, за исключением случаев, когда происходит одно из следующих действий:

  • Это расторгнуто вами. Я предполагаю, что вы принимаете разумные меры предосторожности, чтобы не сделать это по ошибке - и если вы это сделаете, вы, вероятно, узнаете и исправите это самостоятельно. Если это , что критично, то вы должны запустить скрипт от имени другого пользователя, чтобы защитить его от большинства случайных ошибок.

  • Сбой сценария оболочки. Bash имеет , имеет несколько ошибок, как и любое другое программное обеспечение, но я очень сомневаюсь, что что-то такое простое, как цикл, заставит новое показать себя.

  • Что-то общесистемное происходит. Состояние нехватки памяти, аппаратная проблема или даже более распространенная потеря питания. В этом случае:

    1. На какую бы систему вы ни смотрели сценарий, это, вероятно, также будет затронуто.

    2. У вас есть более крупная рыба, которую нужно жарить - как, например, снова подключить систему.

    3. Ты действительно хочешь что-нибудь автоматизировать, разбирая коробку с такими проблемами?

Использование cron для мониторинга процесса имеет две проблемы:

  • Не всегда легко получить правильное решение, особенно если, например, одновременно может быть запущено несколько экземпляров одной и той же программы (например, mplayer ).

  • Вы должны отключить запись cron перед интересующим процессом, если вы хотите отключить его по какой-либо причине.

Если вы действительно серьезно относитесь к перезапуску сценария запуска в случае <insert-favourite-catastrophe>, то вам, вероятно, следует использовать подходящий демон мониторинга процессов, такой как:

http://ps -watcher.sourceforge.net /

http://mmonit.com/monit/

А если вы думаете, что не существует такого понятия, как перебор:

http://www.nagios.com/

http://www.opennms.org/

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