私はこのようになりますいくつかのRubyのコード(sidekiqジョブ)があります。私は、Rubyのコードが(完了までに数時間かかります)、このようなコマンドを開始したいと思い特定のファイルにロギングして、ルビから完全に切り離して、バックグラウンドでスクリプトを開始するには?
module WorkerJobs
class MyJob < SidekiqWorker
def perform country
# Exec, ``, system, Spawn ... whatever?
# ????
end
end
end
を:
"cd ~/my_dir/production && nohub Rscript --vanilla main.r --country #{country} > /home/deployer/my_dir/shared/log/log_#{country}.log 2>&1 &"
目標は何かを待たずに(スクリプトの実行に時間がかかります)、スクリプトを開始し、sidekiqジョブを完了させることです。そうすれば、sidekiqは別のジョブに移動して他の仕事をすることができます。 Sidekiq/rubyはこれまでどおり、仕事の状態の詳細を知る必要はありません。
私はsystem()
を使用しようとしましたが、何らかの理由でstdout/errを指定のログファイルに送信していないようです。私はスクリプトを実行する他の方法について読んでみましたが、どちらの方法がこの場合に使用するのが正しいかわかりません。
module WorkerJobs
class MyJob < SidekiqWorker
def perform country
logfile = "/home/deployer/my_dir/shared/log/log_#{country}.log"
pid = spawn("cd ~/my_dir/production && nohub Rscript --vanilla main.r --country #{country}", [:out, :err] => logfile)
Process.detach(pid)
end
end
end
:スクリプトはそれを行う-何-今までそれが
'exec'はあなたのプロセスをあなたが望んでいないコマンドに置き換えます。 'system'と'%x'(またはbackticks)はコマンドが終了するのを待ちます。しかし、 'spawn'は有望に見えます - それは単にpidを返します。 – Stefan
Sidekiqを使用しているので、ワーカーがコマンドを完了するのを待って、失敗(多分再起動)や並行ジョブ数の制限などを処理できるようにするのは意味がありませんか? – Stefan
いいえ、スクリプトは自己完結型(エラー処理自体など)です。私はちょうど私のwebapp(コントローラのアクションは、スクリプトや他のものを想起するsidekiqジョブをエンキューする)によって呼び出される必要があります。 –