2

Я использую Linux. Я хочу, чтобы процесс (бот 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 (если бот запущен), и запускает бота, если одна из двух проверок не прошла / не соответствует действительности.

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

1 ответ1

1

Я отправил свой вопрос на stackoverflow.com, где я получил ответ;)

https://stackoverflow.com/a/13627784/1081936

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .