2

我正在使用Linux。我希望每次启动计算机时都运行一个进程(一个 irc 机器人)。但是我遇到了一个问题:网络不好,经常断开连接,所以我需要每天手动重启几次机器人。我该如何自动化呢?

附加信息: bot 创建一个名为 bot.pid 的 pid 文件 bot 重新连接自身,但只有几次。网络太糟糕了,所以机器人有时会因为没有响应而自杀。

我目前所做的(也就是我的方法;))我startbot.rb每 5 分钟执行一次 cron 作业。(脚本本身与机器人位于同一目录中)

剧本:

#!/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(如果机器人正在运行)并在两个检查之一失败/不正确时启动机器人。

我的方法似乎很脏,所以我该如何做得更好?

4

2 回答 2

5

重新启动应用程序是一个糟糕的解决方法,而不是解决方案。

我建议查看你的机器人的文档,寻找一个选项来配置它退出多少次错误重试或如何完全禁用此功能。如果 bot 是开源的,您还可以查看其源代码并修改重试代码。尝试找到一个干净的解决方案。

编辑:如今,如果您的系统使用 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 服务,请参阅这个问题arch linux wiki官方文档

然后用systemctl enable bot启动它(重启后启动机器人)和systemctl start bot

或者,我会创建一个循环运行机器人的 shellscript。确保 bot.rb 不会分叉到后台:

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

您可以运行该脚本, nohup ./startscript.sh & 以便在关闭控制台时它不会终止。

于 2012-11-29T14:19:49.317 回答
4

有一个名为 daemontools 的工具,用于监督和管理 UNIX 服务

从此链接您可以学习和使用它。

于 2012-11-29T14:07:18.757 回答