Techioz Blog

Rails タスクをサービスとして開始する方法

概要

Rails アプリケーションに Rails タスクとして TCP サーバーを記述しました。 ただし、次のように開始できます。

  rails socketing:start  

そして、プロセスをバックグラウンドで実行し続けるタスクにしたい場合は、次のように変更してプロセスの実行が開始されます。

nohup rails socketing:start &

1 つのスレッドのみを停止するエラーが発生した場合、TCP サーバーにはマルチスレッドが実装されているため、バックグラウンドで動作し続けます。

ここで、サービスを作成して有効にしたubuntuサーバーの起動時に、このプロセスがサービスによって開始されるようにしたいと思います。 しかしコードブレイク 抜け出す方法を提案していただけますか 私のサービスは次のように書かれています:

[Unit]
Description = TCP at 51234
After = network.target

[Service]
Environment="HOME=/home/vidur"
ExecStart = /home/vidur/rails_app/tukaweb/custom_script.sh

[Install]
WantedBy = multi-user.target

私のcustom_script.shは次のとおりです:

#!/bin/bash

 cd /home/vidur/rails_app/project_dir
/home/vidur/.rbenv/shims/bundler exec rails socketing:start

次のようにサービスを開始します。

sudo systemctl start socketing.service

それは次のように o/p を与えます:

Jun 10 17:45:31 Vidur-PC systemd[1]: Started TCP at 51234.
Jun 10 17:45:31 Vidur-PC systemd[1]: socketing.service: Succeeded.

ただし、rails タスクが開始されず、rails 環境も認識されませんでした。 私は次のようなレールタスクを持っています:

  task start: :environment do
    require 'socket'
    puts "Started TCP Server at PORT 53492"
    server = TCPServer.new 51324 # Server bound to port 51234
   loop do
      Thread.start(server.accept) do |client|
      client.close
    end
   end

    p "result = #{result}"
    p 'Bye'
  end

このコードでは次のエラーが発生します。

Jun 10 19:16:40 Vidur-PC systemd[1]: Started TCP at 53492.
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: rake aborted!
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: ArgumentError: couldn't find login name -- expanding `~'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: /home/vidur/rails_app/tukaweb/config/application.rb:8:in `<top (required)>'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: /home/vidur/rails_app/tukaweb/Rakefile:4:in `require_relative'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: /home/vidur/rails_app/tukaweb/Rakefile:4:in `<top (required)>'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: /home/vidur/.rbenv/versions/2.7.2/bin/bundler:23:in `load'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: /home/vidur/.rbenv/versions/2.7.2/bin/bundler:23:in `<main>'
Jun 10 19:16:43 Vidur-PC custom_script.sh[60012]: (See full trace by running task with --trace)
Jun 10 19:16:44 Vidur-PC systemd[1]: socketing.service: Main process exited, code=exited, status=1/FAILURE
Jun 10 19:16:44 Vidur-PC systemd[1]: socketing.service: Failed with result 'exit-code'.

更新された application.rb ファイル:

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module TukaWeb
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    if Rails.env.development?
        config.active_job.queue_adapter  = :async
      else
        config.active_job.queue_adapter  = :sidekiq
    end

    config.generators.javascript_engine = :js

    config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => 'https://tukadata.tukatech.com',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
    }
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
  end
end

tcp プロセス rake タスクが記載されていますが、root ユーザーのみが対象です。

DB エラーが残っています:

`connect': Access denied for user 'root'@'localhost'

ただし、プロセスを通常どおり実行すると、実行されます。

解決策

ファイルはフォルダー内にあります: /etc/systemd/system:

[Unit]
Description=TCP Service
After=network.target

[Service]
#Environment="HOME=/home/vidur"
ExecStart=/home/vidur/rails_apps/jquery_app/custom_script.sh
Restart=always

[Install]
WantedBy = multi-user.target

必要に応じて次のコマンドも使用します。

sudo systemctl enable tcpstart
sudo ufw allow 3005
sudo service tcpstart start
sudo service tcpstart status