2017-11-21 12 views
0

私はこのようになりますいくつかの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 

:スクリプトはそれを行う-何-今までそれが

+0

'exec'はあなたのプロセスをあなたが望んでいないコマンドに置き換えます。 'system'と'%x'(またはbackticks)はコマンドが終了するのを待ちます。しかし、 'spawn'は有望に見えます - それは単にpidを返します。 – Stefan

+0

Sidekiqを使用しているので、ワーカーがコマンドを完了するのを待って、失敗(多分再起動)や並行ジョブ数の制限などを処理できるようにするのは意味がありませんか? – Stefan

+0

いいえ、スクリプトは自己完結型(エラー処理自体など)です。私はちょうど私のwebapp(コントローラのアクションは、スクリプトや他のものを想起するsidekiqジョブをエンキューする)によって呼び出される必要があります。 –

答えて

0

オーケースクリプトに影響を与えるべきではありません/停止/開始される可能性があります開始sidekiqプロセス/スレッドを実行しながら、再び、私はspawn一緒に行くことになりましたそれは意図どおりに機能しました。

アップデート1

は、しかし、今この問題が発生した:(?関連または関係のない私にはわからない)How to debug R-script suddenly stopping at random point with no error?

更新2

実際に関係しているようです! sidekiqが再開すると(get〜kill -15)、プロセスが中断されます。奇妙な...調査...

最終更新

それはsidekiqがsystemdにによって開始されたことから、systemdには、彼らが実際にいたかどうか(実際には「子」プロセスをニューキングを担当するものであったことを、判明古典的な子プロセスか否か)。これはsystemdのデフォルト動作です。説明はここにあります:Can't detach child process when main process is started from systemd

システムdのkillmodeをprocessに変更すると問題が解決しました。

関連する問題