0

我有三个要同时与 rails 服务器一起运行的应用程序,并且我还希望选择从一个位置终止所有服务器。

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

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

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

任何帮助深表感谢!

4

5 回答 5

2

剧本

您可以尝试以下方法:

#!/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,因此您在括号内设置的环境变量 viaexport不应该存在于括号之外。此外,如果您的三个应用程序位于不同的目录中,您可以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 的工作原理!

于 2013-10-03T01:29:16.813 回答
1

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

于 2013-10-03T00:11:08.797 回答
0

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

于 2013-10-03T02:57:45.023 回答
0

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

于 2013-10-03T01:30:04.917 回答
0

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

查看我的rdev bash 脚本要点- 一个放在 ~/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 技巧

于 2019-04-28T16:55:38.917 回答