【问题标题】:Start unicorn on OSX Startup在 OSX Startup 上启动独角兽
【发布时间】:2012-01-02 19:49:48
【问题描述】:

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

所以为了启动我的服务器,我执行以下操作:

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

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

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

感谢所有帮助。

【问题讨论】:

  • 你在 os x 启动时成功启动你的独角兽了吗?如果是的话,你能把你的工作脚本贴在某个地方吗?我试图在 os x 服务器上做同样的事情但没有成功……

标签: ruby-on-rails ruby macos unicorn


【解决方案1】:

您可能希望将其作为 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>

如果独角兽自己守护进程,您需要添加这个(在&lt;/dict&gt; 行之前):

        <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 以及它如何处理其配置不是很熟悉,但听起来您需要设置一些环境变量才能正确设置它。由于您不是在常规 shell 中进入目录,因此 .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 文件才能使其始终如一地工作。

在启动 unicorn 之前,最好让它实际打开一个 shell 和 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。
  • 很糟糕,它不起作用。这是我的 plist 和一些终端命令。之后用这个命令启动独角兽就可以了。 gist.github.com/a69109245f38eb6f359d你能看一下吗?
  • 您在使用sudo launchctl load 命令时是否遇到任何错误?系统日志中是否有任何提示?我添加了一些关于如何获取更多调试信息的注释,所以尝试一下……另外,我假设 unicorn 应该以 root 身份运行,对吗?
  • 否,在给定的用户帐户 ~/Library 下。有机会吗?
  • 在这种情况下,您需要指定用户帐户来运行它;我已经编辑了答案以涵盖这一点。
【解决方案2】:

创建一个 bash 脚本:

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

保存并使其可执行:

chmod +x scriptname.sh

然后,假设您运行的是 OS X,在 System Preferences > Accounts > Login Items 中添加此文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2023-03-09
    相关资源
    最近更新 更多