在OSX启动时启动独角兽

3

我目前在OSX Lion下使用RVM和Unicorn进行服务器管理,同时还使用gemset。

因此,启动我的服务器需要执行以下操作:

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

现在我希望这个服务器在我的电脑启动时自动启动。

我读到了一些关于在~/Library/LaunchAgents/中添加一个plist文件并使用launchctl激活它的内容,但我不知道在这个plist文件中写什么来启动我的服务器。

有什么想法吗?而且我认为这很困难,因为gemset需要通过cd进入此目录来激活。

感谢所有的帮助。


你成功地在OS X启动时启动了你的独角兽吗?如果是,你能否把你的工作脚本发布在某个地方呢?我试图在OS X服务器上做同样的事情,但没有成功... - Yannis
2个回答

9
您可能需要将此作为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文件。)

Unicorn有一个选项可以使用标志“-D”来使其成为守护进程,因此目前它不会成为守护进程。我会尝试使用您的plist文件。 - choise
很遗憾,它不能正常工作。这是我的plist和一些终端命令。使用此命令启动独角兽之后可以正常工作。https://gist.github.com/a69109245f38eb6f359d你能否请看一下? - choise
当您执行sudo launchctl load命令时,是否出现任何错误?系统日志中是否有任何提示性信息?我添加了一些关于如何获取更多调试信息的注释,请尝试一下...另外,我假设unicorn应该以root身份运行,这是正确的吗? - Gordon Davisson
不,以给定用户帐户 ~/Library 下的情况下,有机会这样做吗? - choise
看起来在尝试加载独角兽(https://gist.github.com/8138401f267bb2db8a33)时,它似乎没有使用正确的Ruby版本和gemset。当使用`.rvmrc`文件(http://beginrescueend.com/workflow/rvmrc/)进入项目目录时,Ruby版本和gemset会被加载。 - choise
显示剩余2条评论

4
创建一个bash脚本:
#!/bin/sh
cd /xyz/project
unicorn -c /xyz/project/config/unicorn.rb -E production

保存并使其可执行:

chmod +x scriptname.sh

假设您正在使用OS X操作系统,那么请在“系统偏好设置-账户-登录项”中添加此文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接