Как убедиться, что процесс запущен, даже если он самоуничтожается? (тогда его нужно перезапустить)

Я использую линукс. Я хочу, чтобы процесс (бот irc) запускался каждый раз, когда я запускаю компьютер. Но у меня проблема: сеть плохая и часто отключается, поэтому приходится вручную перезапускать бота несколько раз в день. Как мне это автоматизировать?

Дополнительная информация: Бот создает pid-файл с именем bot.pid. Бот переподключается, но только несколько раз. Сеть слишком плохая, поэтому бот иногда убивает себя, потому что не получает ответа.

Что я делаю в настоящее время (также известный как мой подход;)) У меня есть задание cron, выполняющее startbot.rb каждые 5 минут. (Сам скрипт находится в той же директории, что и бот)

Сценарий:

#!/usr/bin/ruby
require 'fileutils'

if File.exists?(File.expand_path('tmp/bot.pid'))
  @pid = File.read(File.expand_path('tmp/bot.pid')).chomp!.to_i
  begin
    raise "ouch" if Process.kill(0, @pid) != 1
  rescue
    puts "Removing abandoned pid file"
    FileUtils.rm(File.expand_path('tmp/bot.pid'))
    puts "Starting the bot!"
    Kernel.exec(File.expand_path('./bot.rb'))
  else
    puts "Bot up and running!"
  end
else
  puts "Starting the bot!"
  Kernel.exec(File.expand_path('./bot.rb'))
end

Что это делает: Он проверяет, существует ли файл pid, если это правда, он проверяет, если kill -s 0 BOT_PID == 1 (если бот работает), и запускает бота, если одна из двух проверок не удалась / не соответствует действительности.

Мой подход кажется довольно грязным, так как мне сделать это лучше?


person le_me    schedule 29.11.2012    source источник


Ответы (2)


Перезапуск приложения — плохой обходной путь, а не решение.

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

редактировать: в настоящее время, если ваша система использует systemd вместо init, создайте служебный файл /etc/systemd/system/bot.service для вашего бота следующим образом:

[Unit]
Description=bot service
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=10
ExecStart=/usr/bin/ruby /path/to/bot.rb

[Install]
WantedBy=multi-user.target

Это перезапустит бота через 10 секунд. Также рассмотрите возможность использования директивы User=, чтобы он не запускался с привилегиями root, если в этом нет необходимости, или с использованием пользовательского экземпляра systemd. Дополнительные сведения о параметрах см. в документации по systemd. Для пользовательской службы systemd см. этот вопрос, архив linux wiki и официальная документация.

затем запустите его с помощью systemctl enable bot (запускает бота после перезагрузки) и systemctl start bot.

в качестве альтернативы я бы создал сценарий оболочки, который запускает бота в цикле. убедитесь, что bot.rb не переходит в фоновый режим:

#/bin/bash
for (( ; ; ))
do
     ./bot.rb
done

вы можете запустить этот скрипт с помощью nohup ./startscript.sh &, чтобы он не завершился, если вы закроете консоль.

person bhelm    schedule 29.11.2012

Существует инструмент под названием daemontools, который был создан для контроля и управления службами UNIX.

По этой ссылке вы можете узнать и использовать ее.

person Chipmunk    schedule 29.11.2012
comment
это хороший ответ, спасибо, но я думаю, что с помощью цикла я смогу сделать то же самое проще;) - person le_me; 29.11.2012