デーモンとして実行しているルビープロセスのPIDファイルが間違ったPIDを取得しています。実行/etc/init.d/sinatra start
すると2つのプロセス- sh
とが作成ruby
され、PIDファイルで終わるPIDはsh
プロセスのPIDになります。これは、次に/etc/init.d/sinatra stop
またはを実行すると/etc/init.d/sinatra restart
、shを強制終了し、rubyプロセスを実行したままにすることを意味します。
私は、a)スクリプトが2つのプロセス(shとrubyだけでなく、rubyだけでなく)を起動する理由、およびb)単にrubyを起動するように修正する方法を知りたいのですが?
セットアップの詳細:
デーモンとして実行されているubuntuサーバー上に小さなSinatraサーバーがセットアップされています。自動的にサーバの起動時に名前のスクリプトを実行するように設定されているsinatra
中で/etc/init.d
それが制御スクリプト起動control.rb
し、サーバーを起動するルビーデーモンコマンドを実行します。スクリプトは、「sinatrauser」アカウントで実行されます。このアカウントには、スクリプトに必要なディレクトリへのアクセス許可があります。
/etc/init.d/sinatraの内容
#!/bin/bash
# sinatra Startup script for Sinatra server.
sudo -u sinatrauser ruby /var/www/sinatra/control.rb $1
RETVAL=$?
exit $RETVAL
このスクリプトをインストールするには、単にコピーして/etc/init.d/
実行しました
sudo update-rc.d sinatra defaults
/var/www/sinatra/control.rbの内容
require 'rubygems'
require 'daemons'
pwd = Dir.pwd
Daemons.run_proc('sinatraserver.rb', {:dir_mode => :normal, :dir => "/opt/pids/sinatra"}) do
Dir.chdir(pwd)
exec 'ruby /var/www/sinatra/sintraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1'
end
ps -Aからの出力の一部
6967 ? 00:00:00 apache2
10181 ? 00:00:00 sh <--- PID file gets this PID
10182 ? 00:00:02 ruby <--- Actual ruby process running Sinatra
12172 ? 00:00:00 sshd
PIDファイルはで作成され/opt/pids/sinatra/sinatraserver.rb.pid
、常にshインスタンスのPIDが含まれます。これは、常にrubyプロセスのPIDよりも1つ小さくなります
編集:mickeのソリューションを試しましたが、見ている動作には影響がありませんでした。
これはからの出力ですps -A f
。この出力は、使用するsudo -u sinatrauser ...
かsu sinatrauser -c ...
、/ etc / init.dのサービス開始スクリプトで同じに見えます。
1146 ? S 0:00 sh -c ruby /var/www/sinatra/sinatraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1
1147 ? S 0:00 \_ ruby /var/www/sinatra/sinatraserver.rb