Как заставить скрипт работать все время в Linux?

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

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

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

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


person tarabyte    schedule 27.09.2014    source источник
comment
См. Сторожевой таймер. Сама программа никогда не должна умереть, если она написана надежно, но если она все же умрет, есть автоматизированные системы, которые сообщат об этом и/или перезапустят ее. Если он может восстановиться, это другая история, и он зависит от того, как он завершился, и от состояния, в котором данные/операция были оставлены, а также от любых основных гарантий или отсутствия. Чтобы предотвратить модификацию, просто заберите права доступа.   -  person user2864740    schedule 27.09.2014
comment
Блогеры Ghost использовали supervisord для просмотра и перезапуска процесса, в котором может произойти сбой.   -  person Paul    schedule 27.09.2014
comment
аналогично: stackoverflow.com/questions/10922754/   -  person Paul    schedule 27.09.2014
comment
Какой дистрибутив линукса? Использует ли он инициализацию SysV? Выскочка? Системд?   -  person Robᵩ    schedule 27.09.2014


Ответы (1)


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

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

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

Debian/Ubuntu: супервизор установки apt-get

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

Большинство других дистрибутивов: easy_install supervisor

Убедитесь, что Supervisor запущен, запустив 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"

Запустите Ghost с помощью Supervisor: supervisorctl start ghost

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

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

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

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

  1. Установите супервизора, как описано выше, но ничего не настраивайте для призрака.
  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 

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

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

person Paul    schedule 27.09.2014