2014-09-27 3 views
2

Я пытаюсь запустить простой скрипт python все время. Я хочу, чтобы он запускался автоматически при загрузке и мог восстанавливаться после сбоев. То есть, если есть сбой, который заставляет скрипт остановиться, мне все равно, и просто хочу, чтобы он снова запустился. Я в порядке, если все устройство перезагрузится.Как сохранить скрипт, работающий все время в Linux?

Я только что протестировал рабочий скрипт using init.d, но не уверен, как оправиться от сбоя? Есть ли проверка cronjob на наличие pid?

Я также хотел бы проверить целостность. То есть, я хотел бы убедиться, что сценарий случайно не был изменен каким-либо другим процессом. Я слышал о проверке CRC32 скрипта на известном значении, но я не уверен, как получить какой-либо md5 в файле, который выполняется.

Это супер простой скрипт python btw (один файл, ~ 20 строк). Я не уверен, что это действительно что-то изменит.

+0

См. [Сторожевой таймер] (http://en.wikipedia.org/wiki/Watchdog_timer). Сама программа никогда не должна умирать, если она написана «надежно», но если она умирает, есть автоматизированные системы для отправки и/или перезапуска. Если он * может * восстановить, это еще одна история и зависит от того, как она прекращена, и состояния, в котором остались данные/операция, и каких-либо основных гарантий или недостатков. Чтобы предотвратить изменение, просто уберите права доступа. – user2864740

+0

Блогеры [Ghost] (https://ghost.org) использовали [supervisord] (http://supervisord.org/) для просмотра и перезапуска процесса, который может завершиться неудачей. – Paul

+1

похоже на: http://stackoverflow.com/questions/10922754/python-watchdog-for-another-python-process-technique/10922938#10922938 – Paul

ответ

2

Ghost blogging platform installation instructions [Лицензия: CC-BY-3.0] есть раздел, показывающий, как использовать supervisord развернуть nodejs скрипт (который запускает блог), так что он будет перезагружен, когда он терпит неудачу и перезагрузки системы.

Supervisor (http://supervisord.org/) Популярные Linux дистрибутивы, такие , как Fedora, Debian и Ubuntu-поддерживать пакет для Supervisor: Система управления процесса, который позволяет запускать Призрак при запуске без использования сценариев инициализации. В отличие от сценария инициализации, Supervisor - это , переносимый между дистрибутивами Linux и версиями.

Установите диспетчер, как требуется для вашего дистрибутива Linux. Как правило, это будет:

Debian/Ubuntu: APT-получить установку супервизор

Fedora: ни установить супервизор

Большинства других дистрибутивов: easy_install супервизор

Убедитесь, что руководитель работает, по running service supervisor start Создайте сценарий запуска для установки Ghost. Как правило, это будет идти в /etc/supervisor/conf.d/ghost.conf Например:

[program:ghost] 
command = node /path/to/ghost/index.js 
directory = /path/to/ghost 
user = ghost 
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/ghost.log 
stderr_logfile = /var/log/supervisor/ghost_err.log 
environment = NODE_ENV="production" 

Начало Призрачный с помощью супервизора: supervisorctl начать призраку

Чтобы остановить Призрак: supervisorctl остановка призраку

OK, поэтому, если ваш скрипт называется myscript.py, и он принадлежит пользователю Змея и живет в /home/snake.

Тогда команда должна быть python /home/snake/myscript.py, то каталог должен быть там, где вы хотите запустить это (мы предполагаем, что это /home/snake), то пользователь должен быть установлен соответствующим образом (мы предполагаем, что вы хотите для запуска в качестве пользователя змейка), авто остаются неизменными, а лог-файлы должны быть переименованы.

Окружающая среда устанавливает любые переменные ENV, которые необходимы сценарию. Как правило, вам не нужны никакие, если вы не используете их для управления аспектами вашего сценария.

  1. Установка supervisord, как указано выше, но не создали ничего для призрака
  2. Вместо Создать /etc/supervisor/conf.d/myscript следующим образом:
  3. supervisorctl начать MyScript

/etc/supervisor/conf.d/myscript

[program:myscript] 
command = python /home/snake/myscript.py 
directory = /home/snake 
user = snake 
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/myscript.log 
stderr_logfile = /var/log/supervisor/myscript_err.log 

Должен быть запущен и перезапускается даже при перезагрузке.

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