我想从中央(Sinatra)应用程序控制许多不同的Sinatra应用程序。
我遇到的问题是无论我执行/生成/分叉调用启动它的方式,我都无法获取Sinatra服务器的pid以便我可以杀死(:int)它?
这是由于我的shell exec字符串,它首先包含一些其他命令,所以我得到了第一个的pid。 我的命令字符串就像
command = source ~/.profile; rbenv #{ver}; some_env=1234 ruby app.rb
所以我得到了采购命令的sh过程的pid。
问题是,我怎样才能获得上面启动的ruby命令的pid?
我目前正在使用spawn,但也尝试了其他大多数,但我不认为这是问题!?
pid = Process.spawn(command)
pid # => 1234
ruby应用程序本身启动
$ ps aux
1234 sh -c . ~/.profile; shell_script
4567 shell_script
我想知道4567!?
答案 0 :(得分:0)
没有简单的方法来获取您的' 4567'但您应该能够使您的流程与Process.spawn
返回的pid相同。
尝试使用exec
结束命令,而不是直接调用ruby,即:
source ~/.profile; rbenv #{ver}; export some_env=1234; exec ruby app.rb
答案 1 :(得分:0)
你可以检查进程“shell_script”是否为“sh -c。〜/ .profile; shell_script”的子进程。你可以通过“ps -axgf”命令检查它。
如果它是父母,那么你可以使用pid 1234的组ID(从ps -axgf的输出得到它)来使用这个命令杀死带有pid 4567的孩子。
kill -9 -1234(假设1234是组ID)