您可能需要将此作为LaunchDaemon而不是LaunchAgent运行。守护程序在系统上下文中运行,因此可以在系统启动时,在任何人登录之前运行。代理在登录会话中运行,因此直到用户登录后才开始运行(并且作为用户而不是root运行,如果两个用户同时使用快速切换登录,则会为每个用户运行一个副本,等等)。.plist文件本身对于守护程序与代理大致相同,区别在于您将其放置在/Library/LaunchDaemons还是/Library/LaunchAgents中。
该文件本身取决于一些事情。 我假设它需要在系统启动时启动。它是否使自己成为守护进程(即进入后台)?launchd不喜欢它启动的程序成为守护进程,因为它希望能够监视它们并在它们崩溃/退出时重新启动它们。如果unicorn有一个不使自己成为守护进程的选项,请使用该选项;如果没有,则需要稍微更改.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>
如果独角兽(daemon)自身进行守护进程(daemonize),则需要在
</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以获取有关出现问题的提示。
编辑2: 要以不同的用户身份运行,请添加类似以下内容:
<key>UserName</key>
<string>choise</string>
编辑3:我对rvm及其配置不是很熟悉,但听起来你需要设置一些环境变量以正确设置它。由于您没有在常规shell中cd到目录中,因此.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文件才能保持一致。
最好的方法可能是实际打开一个shell并在启动unicorn之前“source”所有必要的设置文件。您可以使用shell脚本执行此操作,或者只需将必要的命令序列作为(单个长)参数包含在shell中。要执行此操作,请将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文件。)