在OSX Startup上启动独角兽

时间:2012-01-02 19:49:48

标签: ruby-on-rails ruby macos unicorn

我目前正在osx lion下使用rvm和unicorn进行服务器管理。 我也使用gemset。

所以为了启动我的服务器我做了以下事情:

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

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

任何想法?我认为这很困难,因为宝石需要通过cd进入这个目录来激活。

感谢所有人的帮助。

2 个答案:

答案 0 :(得分:9)

您可能希望将其作为LaunchDaemon运行,而不是LaunchAgent。守护进程在系统上下文中运行,因此可以在任何人登录之前在系统启动时运行。代理在登录会话中运行,因此在用户登录之前不会启动(并以用户身份运行,而不是以root身份运行,如果有两个用户通过快速切换立即登录,他们将为每个用户运行副本,并且...)。守护进程与代理的.plist文件本身几乎相同,不同之处在于您是将它放在/ Library / LaunchDaemons还是/ Library / LaunchAgents中。

文件本身取决于一些事情。我假设它需要在系统启动时启动。它是否会守护自己(即落入后台)? launchd不喜欢它自己启动的程序,因为它希望能够监视它们,并且如果它们崩溃/退出可能会重新启动它们。如果独角兽有选择不守护,那就用它;如果没有,您需要稍微更改.plist文件以适应它。首先,这是一个基本的run-at-startup 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.您可以使用{{1}激活它},或重启。

编辑:为了排除故障,您可以将以下内容添加到.plist文件中:

sudo launchctl load /Library/LaunchDaemons/local.unicorn.plist

然后卸载( <key>StandardOutPath</key> <string>/tmp/unicorn.out</string> <key>StandardErrorPath</key> <string>/tmp/unicorn.err</string> <key>Debug</key> <true/> )并重新加载它,并检查/var/log/system.log,/tmp/unicorn.out和/tmp/unicorn.err以获取有关出错的提示。

EDIT2:要以其他用户身份运行,请添加以下内容:

sudo launchctl unload /Library/LaunchDaemons/local.unicorn.plist

EDIT3:我不熟悉rvm以及它如何处理它的配置,但听起来你需要设置一些环境变量来正确设置它。由于您没有进入常规shell中的目录,因此.rvmrc文件永远不会运行。有几种方法可以解决这个问题。

首先,您可以找出需要设置的环境变量,并将其添加到.plist文件中,如下所示:

        <key>UserName</key>
        <string>choise</string>

......但这可能有点脆弱,特别是如果他们改变了;您需要同时更新.rvmrc和.plist文件才能始终如一地工作。

在启动unicorn之前让它实际打开一个shell并 <key>EnvironmentVariables</key> <array> <key>ruby_string</key> <string>ruby-1.9.2-p136</string> <key>gemset_name</key> <string>unicorn</string> </array> 所有必要的安装文件可能会更好。您可以使用shell脚本执行此操作,或者仅将必要的命令序列作为(单个long)参数包含在shell中。为此,请使用以下内容替换ProgramArguments部分:

source

(但不要输出任何不存在的rvmrc文件。)

答案 1 :(得分:4)

创建一个bash脚本:

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

保存并使其可执行:

chmod +x scriptname.sh

然后,假设您正在运行OS X,请在“系统偏好设置”&gt;中添加此文件。帐户&gt;登录项目。