2

Файл 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

2 ответа2

1

Причиной этого является форма exec, которую вы используете. Если вы отделите команду от параметров, это позволит избежать создания оболочки. Посмотрите эту проблему Github для тех, кто решает аналогичную проблему: https://github.com/sunspot/sunspot/pull/221.

1

Первый процесс - это sudo, запускающий ruby. Проверьте с помощью ps -A f . Измените строку sudo для запуска команды.

su sinatrauser -c "ruby /var/www/sinatra/control.rb $1"

редактировать: я думаю, что su выглядит аккуратнее в сценариях, как это:

    su - someuser <<CHBACK
    ls $HOME // do stuff
    echo "do more stuff as $USER"
    CHBACK
    echo "Now I'm $USER again"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .