Запустите единорога при запуске OSX - PullRequest
3 голосов
/ 02 января 2012

В настоящее время я использую rvm и единорога для управления сервером под osx lion. я также использую драгоценный камень.

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 03 января 2012

Возможно, вы захотите запустить его как LaunchDaemon, а не как LaunchAgent.Демоны работают в системном контексте и, следовательно, могут запускаться при запуске системы, прежде чем кто-либо войдет в систему. Агенты запускаются в сеансах входа в систему и поэтому не запускаются до тех пор, пока пользователь не войдет в систему (и не будет работать как пользователь не как root, а если два пользователявойдите сразу с быстрым переключением, они будут запускать копии для каждого пользователя, и ...).Сам файл .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 или перезагрузкой.

EDIT:для устранения неполадок вы можете добавить что-то вроде этого в файл .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: I'mне очень знаком с rvm и с тем, как он обрабатывает свою конфигурацию, но, похоже, вам нужноt некоторые переменные окружения для правильной настройки.Поскольку вы не можете зайти в каталог в обычной оболочке, файл .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 все необходимые файлы установки перед запускомединорог.Это можно сделать с помощью сценария оболочки или просто включив необходимую последовательность команд в качестве (единого длинного) параметра в оболочку.Чтобы сделать это, замените раздел 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, которые не существуют.)

4 голосов
/ 03 января 2012

Создать скрипт bash:

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

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

chmod +x scriptname.sh

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

...