【问题标题】:Bash Script to run three different rails apps on the local server?在本地服务器上运行三个不同的 Rails 应用程序的 Bash 脚本?
【发布时间】:2013-10-03 00:05:56
【问题描述】:

我想在 Rails 服务器上同时运行三个应用程序,并且我还想要从一个位置终止所有服务器的选项。

我对 Bash 没有太多经验,所以我不确定我会使用什么命令来启动特定应用程序的服务器。由于脚本不会在应用程序目录中,因此普通 rails s 将不起作用。

从那里,我想如果我可以收集三个服务器正在运行的进程的 PID,我可以让脚本提示用户输入,并且每当输入某些内容时都会终止这三个进程。我只是不确定如何获取 PID。

此外,每个应用程序都有一些环境变量,我希望它们具有与应用程序配置文件中分配的值不同的值。以前,我在 rails 之前使用 export var=value,但我不确定如何保证每个单独的进程都获取正确的变量。

非常感谢任何帮助!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 bash shell


    【解决方案1】:

    脚本

    您可以尝试以下方法:

    #!/bin/bash
    
    case "$1" in
      start)
        pushd app/directory
        (export FOO=bar; rails s ...; echo $! > pid1)
        (export FOO=bar; rails s ...; echo $! > pid2)
        (export FOO=bar; rails s ...; echo $! > pid3)
        popd
        ;;
    
      stop)
        kill $(cat pid1)
        kill $(cat pid2)
        kill $(cat pid3)
        rm pid1 pid2 pid3
        ;;
    
      *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    

    将此脚本保存到文件中,例如script.shchmod +x script.sh。您可以使用./script.sh start 启动服务器,然后您可以使用./script.sh stop 将它们全部杀死。您需要在启动服务器的三行中填写所有详细信息。

    说明

    首先是pushd:这会将目录更改为您的应用所在的位置。三个启动行之后的popd 将使您返回到脚本所在的位置。 (export blah blah) 周围的括号创建一个子shell,因此您通过export 在括号内设置的环境变量不应存在于括号之外。此外,如果您的三个应用程序位于不同的目录中,您可以在三个括号中的每一个中放置一个cd,以移动到rails s 之前的应用程序目录。然后这些行看起来像:export FOO=bar; cd app1/directory; rails s ...; echo $! > pid1。不要忘记cd 命令后面的分号!在这种情况下,您还可以删除 pushdpopd 行。

    在 Bash 中,$! 是最后一个命令的进程 ID。我们回应并重定向(使用>)到一个名为pid1(或pid2pid3)的文件。稍后,当我们想杀死服务器时,我们运行kill $(cat pid1)$(...) 运行命令并返回内联输出。由于 pid 文件只包含进程 ID,cat pid1 将只返回进程 ID 号,然后将其传递给 kill。在我们杀死服务器后,我们也会删除 pid 文件。

    免责声明

    这个脚本在错误检查和配置方面可能需要更多的工作,我还没有测试过,但它应该可以工作。至少,它应该为您编写自己的脚本提供一个良好的起点。

    附加信息

    我最喜欢的 bash 资源是 Advanced Bash-Scripting Guide。 Bash 实际上是一种相当强大的语言,具有一些简洁的特性。我绝对推荐学习 bash 的工作原理!

    【讨论】:

    • 我的应用程序位于不同的目录中,因此我将在命令链中使用 cd。是不是意味着我在使用rm删除的时候还要在pid1、pid2、pid3前面加上对应的路径?
    • 啊,好点子!我建议将所有 pid 文件保存在同一位置 - 可能相对于脚本本身。因此,您可以执行以下操作: (export FOO=bar; pushd path/to/app1; rails s ...; popd; echo $! > pid1) 这将创建相对于脚本本身的 pid 文件,因此停止命令将工作正常。
    【解决方案2】:

    为什么不试试 capistrano,它是通过 SSH 在多台远程机器上并行执行命令的框架。它有很多食谱可以做到这一点。

    【讨论】:

    • 我其实很好奇如何在 bash 中做到这一点,如果它过于复杂,我当然会去别处看看。
    【解决方案3】:

    您最好设置pow.cx,它将根据需要运行每个服务器,而不必手动启动和关闭服务器。

    【讨论】:

      【解决方案4】:

      您可以使用Foreman 来运行、监控和管理您的流程。

      【讨论】:

        【解决方案5】:

        我意识到我在这里聚会迟到了,但是在互联网上搜索了一个很好的解决方案之后(并找到了这个页面,但很少有其他页面,没有一个完整的解决方案),并且在尝试让 prax 工作失败之后,我决定自己写一个解决这个问题的方法,并回馈给社区!

        查看我的rdev bash script gist - 您放入 ~/bin 目录的 bash 脚本。这将在 gnome-terminal 中为每个 rails 应用程序创建一个新选项卡,其中应用程序名称和端口位于选项卡标题中。它通过检查端口是否正在使用以及进程是否实际运行来验证应用程序是否成功启动。它还通过确保端口不再使用并且进程不再运行来验证 Rails 应用程序关闭是否成功。

        设置非常简单,只需更改这两个配置值:

        # collection of rails apps you want to start in development (should match directory name of rails project)
        # note: the first app in the collection will receive port 3000, the second 3001 and so on
        #
          rails_apps=(app1 app2 app3 etc)
        #
        # The root directory of your rails projects (~/ is assumed, do not include)
        #
          projects_root="ruby/projects/root/path"
        

        使用此脚本,您可以在一个命令中启动所有 Rails 应用程序或全部停止它们,您还可以停止、启动和重新启动单个 Rails 应用程序。当 OP 请求运行 3 个应用程序时,这将允许您根据需要运行任意数量的端口,并按顺序从列表中的第一个应用程序的 3000 开始分配端口。由于 chruby,每个应用程序都使用正确的 ruby​​ 版本启动,并且 .env 是在升级过程中获取的,因此您的应用程序将拥有所需的一切。一旦你完成了 rdev stop 的开发,你所有的 Rails 应用程序都将被终止,终端窗口将关闭。

        # Usage Examples:
        #
        # Show Help
        #  ~/> rdev
        #    Usage: rdev {start|stop|restart} [app port]
        #
        # start all rails apps
        #  ~/> rdev start
        #
        # start a single rails app
        #  ~/> rdev start app port
        #
        # stop all rails apps
        #  ~/> rdev stop
        #
        # stop a single rails app
        #  ~/> rdev stop app port
        #
        # restart a single rails app
        #  ~/> rdev restart app port
        

        作为记录,所有测试都是在 Ubuntu 18.04 上完成的。此脚本需要:bashchrubygnome-terminallsof 并利用 BASH_POST_RC trick

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-14
          • 2013-12-28
          • 1970-01-01
          • 2012-11-11
          • 1970-01-01
          • 2015-02-18
          • 1970-01-01
          相关资源
          最近更新 更多