Ruby 杀死已从shell分离的子进程

Ruby 杀死已从shell分离的子进程,ruby,shell,exec,Ruby,Shell,Exec,我想从中央(Sinatra)应用程序控制许多不同的Sinatra应用程序 我的问题是,无论我以何种方式执行/spawn/fork调用来启动它,我都无法获取Sinatra服务器的pid,以便我可以杀死(:int)它 这是由于我的shell exec字符串,它首先包含一些其他命令,所以我得到了第一个命令的pid。 我的命令字符串如下 command = source ~/.profile; rbenv #{ver}; some_env=1234 ruby app.rb 所以我得到了sourcing

我想从中央(Sinatra)应用程序控制许多不同的Sinatra应用程序

我的问题是,无论我以何种方式执行/spawn/fork调用来启动它,我都无法获取Sinatra服务器的pid,以便我可以杀死(:int)它

这是由于我的shell exec字符串,它首先包含一些其他命令,所以我得到了第一个命令的pid。 我的命令字符串如下

command = source ~/.profile; rbenv #{ver}; some_env=1234 ruby app.rb
所以我得到了sourcing命令的sh进程的pid

问题是,如何获取上面启动的ruby命令的pid

我目前正在使用spawn,但也尝试过其他大多数方法,但我认为这不是问题所在

pid = Process.spawn(command)
pid # => 1234
ruby应用程序本身启动

$ ps aux
1234 sh -c . ~/.profile; shell_script
4567 shell_script

我想知道4567

获取“4567”没有简单的方法,但是您应该能够使您的进程具有与
进程相同的pid。spawn
返回

尝试使用
exec
结束命令,而不是直接调用ruby,例如:

source ~/.profile; rbenv #{ver}; export some_env=1234; exec ruby app.rb

您可以检查进程“shell\u script”是否是“sh-c.~/.profile;shell\u script”的子进程。您可以通过“ps-axgf”命令进行检查

如果它是一个父级,那么您可以使用pid 1234的组id(从ps-axgf的输出中获取它)使用此命令杀死pid 4567的子级

kill-9-1234(假定1234是组id)