Возможно, вы захотите запустить его как 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, которые не существуют.)