Файл PID для процесса ruby, который я запускаю как демон, получает неправильный PID. Похоже, что запуск /etc/init.d/sinatra start
создает два процесса - sh
и ruby
, а PID, который заканчивается в файле PID, - это процесс sh
. Это означает, что когда я затем запускаю /etc/init.d/sinatra stop
или /etc/init.d/sinatra restart
, это убивает sh и оставляет процесс ruby все еще запущенным.
Я хотел бы знать, а) почему мой скрипт запускает два процесса - sh и ruby, а не только ruby, и б) как исправить это, чтобы просто запустить ruby?
Детали настройки:
У меня есть небольшой сервер Sinatra, настроенный на сервере Ubuntu, работающий как демон. При запуске сервера устанавливается автоматический запуск сценария sinatra
в /etc/init.d
который запускает сценарий control.rb
, который затем запускает команду ruby daemon для запуска сервера. Сценарий запускается под учетной записью 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
часть вывода из пс -А
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
и всегда содержит PID экземпляра sh, который всегда на единицу меньше, чем PID процесса ruby.
РЕДАКТИРОВАТЬ: Я попробовал решение Майка, но это не повлияло на поведение, которое я вижу.
Это вывод из 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