Запустите единорога при запуске OSX

В настоящее время я использую rvm и unicorn для управления сервером под OSX Lion. Я также использую набор драгоценных камней.

поэтому для запуска моего сервера я делаю следующее:

cd /xyz/project
unicorn -c /xyz/project/config/unicorn.rb -E production

теперь я хочу, чтобы этот сервер запускался при запуске моего компьютера. я читал кое-что о добавлении файла plist в ~/Library/LaunchAgents/ и активации его с помощью launchctl, но я понятия не имею, что написать в этом файле plist для запуска моего сервера.

есть идеи? также я думаю, что это сложно, потому что набор драгоценных камней должен быть активирован путем перехода в этот каталог.

спасибо за помощь.


person choise    schedule 02.01.2012    source источник
comment
Удалось ли вам запустить своего единорога при запуске OS X? Если да, не могли бы вы опубликовать где-нибудь свой рабочий скрипт? Я пытаюсь сделать то же самое на сервере os x без успеха…   -  person Yannis    schedule 20.04.2012


Ответы (2)


Вероятно, вы захотите запустить его как LaunchDaemon, а не как LaunchAgent. Демоны запускаются в контексте системы и, следовательно, могут запускаться при запуске системы до того, как кто-либо войдет в систему. войти сразу с быстрым переключением они будут запускать копию для каждого пользователя, и...). Сам файл .plist практически одинаков для демонов и агентов, разница заключается в том, помещаете ли вы его в /Library/LaunchDaemons или /Library/LaunchAgents.

Сам файл зависит от нескольких вещей. Я предполагаю, что его нужно запускать при загрузке системы. Демонизирует ли он себя (то есть уходит в фоновый режим)? launchd не любит программы, которые он запускает, чтобы демонизировать себя, так как он хочет иметь возможность отслеживать их и, возможно, перезапускать их в случае сбоя/выхода. Если у единорога есть возможность не демонизироваться, используйте ее; если нет, вам нужно немного изменить файл .plist, чтобы адаптироваться к нему. Во-первых, вот базовый файл LaunchDaemon .plist для запуска при запуске:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>local.unicorn</string>
        <key>ProgramArguments</key>
        <array>
                <string>/full/path/to/unicorn</string>
                <string>-c</string>
                <string>/xyz/project/config/unicorn.rb</string>
                <string>-E</string>
                <string>production</string>
        </array>
        <key>WorkingDirectory</key>
        <string>/xyz/project</string>
        <key>RunAtLoad</key>
        <true/>
        <key>EnableTransactions</key>
        <false/>
</dict>
</plist>

Если единорог демонизирует себя, вам нужно добавить это (перед строкой </dict>):

        <key>KeepAlive</key>
        <false/>
        <key>AbandonProcessGroup</key>
        <true/>

Если он не демонизируется (или вы можете заставить его пропустить демонизацию, изменив ProgramArguments), вы можете добавить это вместо этого:

        <key>KeepAlive</key>
        <true/>

Назовите файл, например, /Library/LaunchDaemons/local.unicorn.plist (имя должно соответствовать метке), установите права собственности на root:wheel и разрешения на 600. Вы можете активировать его с помощью sudo launchctl load /Library/LaunchDaemons/local.unicorn.plist или путем перезагрузки.

РЕДАКТИРОВАТЬ: для устранения неполадок вы можете добавить что-то вроде этого в файл .plist:

        <key>StandardOutPath</key>
        <string>/tmp/unicorn.out</string>
        <key>StandardErrorPath</key>
        <string>/tmp/unicorn.err</string>
        <key>Debug</key>
        <true/>

Затем выгрузите (sudo launchctl unload /Library/LaunchDaemons/local.unicorn.plist) и перезагрузите его, а также проверьте /var/log/system.log, /tmp/unicorn.out и /tmp/unicorn.err на наличие подсказок о том, что происходит не так.

EDIT2: для запуска от имени другого пользователя добавьте что-то вроде:

        <key>UserName</key>
        <string>choise</string>

EDIT3: я не очень хорошо знаком с rvm и тем, как он обрабатывает свою конфигурацию, но похоже, что вам нужно установить некоторые переменные среды, чтобы настроить его правильно. Поскольку вы не входите в каталог в обычной оболочке, файл .rvmrc никогда не запускается. Есть несколько способов решить эту проблему.

Во-первых, вы можете выяснить, какие переменные среды необходимо установить, и добавить их в файл .plist примерно так:

        <key>EnvironmentVariables</key>
        <array>
                <key>ruby_string</key>
                <string>ruby-1.9.2-p136</string>
                <key>gemset_name</key>
                <string>unicorn</string>
        </array>

... но это может быть немного хрупким, особенно если они когда-либо изменятся; вам нужно будет обновить файлы .rvmrc и .plist вместе, чтобы они работали согласованно.

Возможно, было бы лучше открыть оболочку и source все необходимые установочные файлы перед запуском unicorn. Вы можете сделать это с помощью сценария оболочки или просто включив в оболочку необходимую последовательность команд в качестве (одного длинного) параметра. Для этого замените раздел ProgramArguments примерно таким:

        <key>ProgramArguments</key>
        <array>
                <string>/bin/bash</string>
                <string>-c</string>
                <string>source /etc/rvmrc; source /Users/server/.rvmrc; source .rvmrc; /Users/server/.rvm/gems/ruby-1.9.2-head@q/bin/unicorn -c /Users/server/Sites/Rails/q/config/unicorn.rb -E production</string>
        </array>

(но не используйте источники любых несуществующих файлов rvmrc.)

person Gordon Davisson    schedule 03.01.2012
comment
unicorn имеет возможность демонизировать его с помощью флага -D, поэтому в настоящее время он не будет демонизироваться. Я попробую ваш плист. - person choise; 03.01.2012
comment
плохо не работает. вот мой plist и некоторые команды терминала. запуск единорога с помощью этой команды впоследствии работает. gist.github.com/a69109245f38eb6f359d не могли бы вы взглянуть? - person choise; 03.01.2012
comment
Вы получаете какие-либо ошибки при выполнении команды sudo launchctl load? Есть ли что-нибудь подозрительное в системном журнале? Я добавил несколько заметок о том, как получить больше информации об отладке, так что попробуйте... Кроме того, я предполагаю, что unicorn должен работать как root, это правильно? - person Gordon Davisson; 04.01.2012
comment
нет, под данной учетной записью пользователя ~/Library. есть ли шансы это сделать? - person choise; 04.01.2012
comment
В этом случае вам нужно указать учетную запись пользователя для запуска; Я отредактировал ответ, чтобы покрыть это. - person Gordon Davisson; 04.01.2012
comment
поэтому кажется, что при попытке загрузить единорога используется неправильная версия ruby ​​​​и набор драгоценных камней ( ). версия ruby ​​​​и gemset загружаются при переходе в каталог проекта с использованием файла .rvmrc (beginrescueend.com/workflow /rvmrc ). - person choise; 05.01.2012
comment
@choise: я добавил пару опций для настройки среды ruby ​​для демона. - person Gordon Davisson; 07.01.2012

Создайте bash-скрипт:

#!/bin/sh
cd /xyz/project
unicorn -c /xyz/project/config/unicorn.rb -E production

Сохраните его и сделайте исполняемым:

chmod +x scriptname.sh

Затем, предполагая, что вы используете OS X, добавьте этот файл в «Системные настройки»> «Учетные записи»> «Элементы входа».

person user2398029    schedule 02.01.2012