杀死与shell分离的子进程

时间:2012-03-28 21:53:54

标签: ruby shell exec

我想从中央(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!?

2 个答案:

答案 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)