質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

【Rails】pumaをforkしてバックグラウンドでpythonスクリプトを動かす。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 486

ninginnn

score 33

やりたいこと

pumaをforkしてバックグラウンドでpythonスクリプトを動かす。

やったこと

この記事
を参考にJobTaskを作った。

class JobTask
  class << self
    def execute(~~, ~~)
      return execute_job(~~, ~~)
    end

    def cancel(pid)
      command = "ps -p #{pid} -o \"pgid\""
      pgid = system_command(command).lines.to_a.last.lstrip.chomp
      if pgid =~ /[0-9]/
        system_command "kill -TERM -#{pgid}"
        return true
      else
        Rails.logger.error 'Process was not found'
      end
    end
    private

    def create_command(~~, ~~)
      #command = <<-"EOS"
      #debugger
      command = "python3 ○○.py"+" "+~~.to_s()+" "+~~
      #EOS
      script_path = "tmp/test_command"
      #debugger
      File.open(script_path, "w", 0750) do |f|
        f.write command
      end

      # execute background and return pid
      "#{script_path} > tmp/test.log 2>&1 & echo $!"
    end

    def execute_job(~~, ~~)
      begin
        fork do
          Process.setsid
          pid = system_command(create_command(~~, ~~)).lstrip.chomp
          if pid =~ /[0-9]/
            pid
          else
            Rails.logger.error 'command has not pid'
            "error"
          end
        end
      rescue => e
        Rails.logger.error e.message
        "error"
      end
    end

    def system_command(command)
      `#{command}`
    end
  end
end


controllerで上のタスクを実行するように書いた

def job
  ~~
  pid = JobTask.execute(~, ~)
  ~~
end

詰まっているところ

この記事を参考に,
本番環境でコントローラー上でpid = JobTask.execute(~, ~)を実行したが、python3が見つからない。というエラーが出た。tmp/test_command: line 1: python3: command not found

開発環境では動作する
本番環境でrails s -b 0.0.0.0 -p 3000をして、そこのサーバー上で起動した場合も動作する
本番環境でコマンド入力でJobTask.execute(~, ~)した場合も動作する

なぜ、本番環境だけでエラーが出るのかがわからない。ご教授願いたいです。pumaに問題があるのだとは思います。
python3 --version
>> python 3.6.3

puma.rbの設定は以下の通りです。

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count

port        ENV.fetch("PORT") { 3000 }

environment 'production'
environment ENV.fetch("RAILS_ENV") { "development" }

workers 1
preload_app!

before_fork do
  PumaWorkerKiller.config do |config|
    # サーバのメモリ(1024MB)
    config.ram           = 1024

    # 確認頻度(5秒毎)
    config.frequency     = 5

    # workerを再起動する閾値(メモリ使用量が65%になったらkill)
    # 一番メモリ使用量の多いworkerを再起動する
    config.percent_usage = 0.65

    # rolling_restartの頻度(12時間に1回)
    # rolling_restart: メモリ使用量に関係なく、順番にworkerを再起動する仕組み
    config.rolling_restart_frequency = 12 * 3600

    # falseにすると監視ログを止める
    # 普通のログに混ざって紛らわしい
    config.reaper_status_logs = true

  end
  PumaWorkerKiller.start
end
plugin :tmp_restart
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

/home/ec2-user/.pyenv/shims/python3
フルパスで実行するのと
実行権限を与えるとうまくいきました。
なぜ本番環境のコントローラーで実行するときだけ、フルパスで指定しなければいけないのか
疑問は残っています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る