2

私はLinuxを使用しています。コンピューターを起動するたびにプロセス (irc ボット) を実行する必要があります。しかし、問題があります。ネットワークが悪く、頻繁に切断されるため、ボットを 1 日に数回手動で再起動する必要があります。それを自動化するにはどうすればよいですか?

追加情報: ボットは bot.pid という名前の pid ファイルを作成します。ボットは自分自身を再接続しますが、数回だけです。ネットワークの調子が悪く、応答がないためにボットが自滅することがあります。

私が現在行っていること (別名私のアプローチ ;)) startbot.rb5 分ごとに 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 ファイルが存在するかどうかをチェックし、それが true の場合kill -s 0 BOT_PID == 1(ボットが実行されているかどうか) をチェックし、2 つのチェックのいずれかが失敗するか true でない場合はボットを起動します。

私のアプローチはかなり汚いようです。

4

2 に答える 2

5

アプリケーションを再起動することは、解決策ではなく、悪い回避策です。

ボットのドキュメントを確認することをお勧めします。無効なリトライが何回終了した後に構成するか、この機能を完全に無効にする方法を探すことをお勧めします。ボットがオープン ソースの場合は、そのソース コードを確認して、再試行コードを変更することもできます。きれいな解決策を見つけてみてください。

編集: 現在、システムが init の代わりに systemd を使用している場合は、ボット用のサービス ファイル /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で起動します。

または、ボットをループで実行するシェルスクリプトを作成します。bot.rb がバックグラウンドに分岐しないようにします。

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

そのスクリプトを実行して nohup ./startscript.sh & 、コンソールを閉じても終了しないようにすることができます。

于 2012-11-29T14:19:49.317 に答える
4

UNIXサービスを監視および管理するために作成されたdaemontoolsと呼ばれるツールがあります

このリンクから、学習して使用できます。

于 2012-11-29T14:07:18.757 に答える