如何确保进程正在运行,即使它自行终止?(然后需要重新启动)

如何确保进程正在运行,即使它自行终止?(然后需要重新启动)

我使用的是 Linux。每次启动计算机时,我都希望运行一个进程(一个 IRC 机器人)。但我遇到了一个问题:网络不好,经常断线,所以我需要每天手动重启机器人几次。我该如何自动完成这一操作?

附加信息:该机器人会创建一个名为 bot.pid 的 pid 文件。该机器人会重新连接,但次数不多。网络太差,因此该机器人有时会因为得不到响应而自杀。

我目前的做法(也就是我的方法 ;))我有一个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(机器人是否正在运行),如果两个检查之一失败或不成立则启动机器人。

我的方法似乎很不妥,那么我该如何做得更好呢?

答案1

我将我的问题交叉发布到了 stackoverflow.com,在那里我得到了答案;)

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

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

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

如果你真的想重新启动它,我会创建一个循环运行机器人的 shellscript。确保 bot.rb 不会分叉到后台:

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

您可以运行该脚本, nohup ./startscript.sh &这样如果您关闭控制台它就不会终止。

相关内容