gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:47 24 4
gpt4 key购买 nike

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

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

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

脚本:

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

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

最佳答案

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

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

编辑:如今,如果您的系统使用的是 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 documentation有关选项的更多信息。对于用户 systemd 服务,请参阅 this question , arch linux wikiofficial documentation .

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

启动它

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

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

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

关于ruby - 如何确保进程正在运行,即使它会自行终止? (然后需要重新启动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com