Вероятно, вы захотите запустить его как 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