Лучший сценарий инициализации для запуска приложения в качестве отдельного пользователя - PullRequest
5 голосов
/ 31 марта 2011

У меня есть приложение, которое запускается под учетной записью пользователя (на основе Plack) и мне нужен скрипт инициализации.

Это выглядит так же просто, как "sudo $ user start_server ...". Я только что написал скрипт LSB с использованием start-stop-daemon, и он действительно неуклюжий и многословный. Это не похоже на правильный путь.

Поработав немного и посмотрев журнал примеров, я все еще не уверен, что лучший способ сделать это - нет единого руководства, которое я нашел.

Прямо сейчас у меня это работает:

start-stop-daemon --background --quiet --start --pidfile $PIDFILE \
                --make-pidfile --chuid $DAEMONUSER \
                --exec $DAEMON -- $DAEMON_OPTS

С DAEMON и DAEMON_OPTS как:

DAEMON="/home/mediamogul/perl5/perlbrew/perls/current/bin/start_server"
DAEMON_OPTS="--port $PORT -- starman --workers $WORKERS /home/mediamogul/MediaMogul/script/mediamogul.psgi"

Затем необходимо настроить способ обнаружения запуска, потому что это скрипт на perl, поэтому perl отображается как команда, а не как "start_server".

(я запускаю это из perlbrew для этой учетной записи пользователя, поэтому он полностью отделен от системного perl, поэтому пути указывают на perl в пользовательском каталоге)

Это действительно лучший способ сделать это? Мне это кажется очень неуклюжим, но я не администратор.

1 Ответ

3 голосов
/ 31 марта 2011

Вы можете использовать опцию --pid для Starman, чтобы она записывала PID при запуске приложения. Если вы используете то же имя файла, что и для start-stop-daemon, оно будет работать нормально.

Например, из одного из моих скриптов init.d: ​​

<code>
SITENAME=mysite
PORT=5000
DIR=/websites/mysite
SCRIPT=bin/app.pl
USER=davidp</p>

<p>PIDFILE=/var/run/site-$SITENAME.pid</p>

<p>case "$1" in
  start)
    start-stop-daemon --start --chuid $USER --chdir $DIR  \
        --pidfile=$PIDFILE \
        --exec /usr/local/bin/starman -- -p $PORT $SCRIPT -D --pid $PIDFILE
    ;;
  stop)
    start-stop-daemon --stop --pidfile $PIDFILE
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop}" >&2
    exit 3
    ;;
esac

Это очень близко к тому, что вы уже делаете, и я признаю, что это немного неуклюже, само собой разумеется, но это работает - если Starman записывает PID-файл, это означает, что start-stop-daemon может надежно запустить и остановить его.

...