在Ruby中,我运行了一个系统(“command here”),它不断监视文件的变化,类似于尾部。我希望我的程序继续运行,而不是在system()调用中停止。 Ruby中有没有办法创建另一个进程,以便两者都可以独立运行,将结果输出到终端,然后当您退出程序时,创建的应用程序的所有进程都将被删除?Ruby运行两个进程,将结果输出到终端,并安全结束
1
A
回答
2
2
你不想使用system
作为等待过程来完成。您可以使用spawn
,然后使用wait(避开僵尸)。然后,当你想退出时,发送一个SIGTERM到你产生的进程。您也可以使用fork
来启动您的子进程,但如果您使用外部程序,则spawn
可能更容易。
您也可以使用进程组而不是跟踪所有进程ID,然后一个Process.kill('TERM', -process_group_id)
调用将处理事情。您的子进程应该在同一个进程组中结束,但如果您需要,则有Process.setpgid
。
下面是一个使用fork
(更容易将它全部封装在一个包中)的示例。
def launch(id, sleep_for)
pid = Process.fork do
while(true)
puts "#{id}, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep(sleep_for)
end
end
# No zombie processes please.
Process.wait(pid, Process::WNOHANG)
pid
end
# These just forward the signals to the whole process group and
# then immediately exit.
pgid = Process.getpgid(Process.pid())
Signal.trap('TERM') { Process.kill('TERM', -pgid); exit }
Signal.trap('INT') { Process.kill('INT', -pgid); exit }
launch('a', 5)
launch('b', 3)
while(true)
puts "p, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep 2
end
如果运行在一个终端,然后从另一个杀死它(使用shell的kill
命令),你会看到,孩子们也被打死。如果你删除了“将这个信号转发给整个过程组”Signal.trap
的东西,那么一个简单的SIGTERM会让这些孩子仍然在运行。
所有这些都假设你正在某种Unixy系统(例如Linux或OSX),YMMV等其他地方工作。
0
还有一次使用Spawn的投票。我们在生产中使用它很多,而且非常稳定。
相关问题
- 1. pycharm终端并运行给出不同的结果
- 2. 将两个bash循环结果值输出到同一行?
- 3. 将两个结果合并到一个结果集中mysql
- 4. 将结果输出到erb
- 5. 用C++运行一个进程,过滤输出并得到结果代码并得到系统错误,一起
- 6. start-job并行运行命令并输出结果
- 7. 终端输出不是逻辑分析仪得到的结果
- 8. ssh进入终端并保存终端输出到文件
- 9. Bash文件:并行运行进程,并在其中一个结束时停止
- 10. 运行过程openfiles输出结果到文件
- 11. 将输出重定向到两个进程并合并
- 12. 将两个并发程序的输出与bash结合使用
- 13. Mac OSX:运行一个避免输入sudo密码并在执行结束时关闭终端的脚本
- 14. 输出这两个表的结果
- 15. 将两个查询的结果合并为一个结果SQL
- 16. ASP.net:我如何运行Reflection.Type,并将结果输出到webform文本框中?
- 17. 运行一个perl脚本,需要输出结果到VB.net
- 18. 是std :: map ::结束线程安全,并保证它始终相同的容器?
- 19. 从一个表中进行选择并查找另一个表并在输出结果中获得结果
- 20. 熊猫:比较每两行并输出结果到一个新的数据帧
- 21. PHP PDO选择并输出第一个找到的行结果
- 22. 从两个SQL语句合并结果到一个呈现出新的结果
- 23. 在OSX Lion的终端中安装并运行ruby脚本
- 24. 将结果作为网格/单行结果集输出到多行
- 25. (存储程序)将结果2行合并为1行结果
- 26. 运行w32tm并将结果赋值给变量给出不同的输出
- 27. 如何解析ffprobe输出并根据结果运行ffmpeg?
- 28. 如何在C#中运行tracetcp并获取输出结果?
- 29. 批处理:将查询结果输出到CSV结果
- 30. ruby on rails解析字符串并将结果输出到现有表中
当程序退出时是否想要杀死所有的子进程,或者是否希望在退出之前等待子进程完成? –
程序退出时终止所有子进程。两个进程都在监视文件的变化,所以两者都不会完成。 – jaysonp