ruby - 作为脚本调用时 trap 不工作;但适用于 IRB

标签 ruby multiprocessing exit-code

我正在尝试多个进程。我正在捕获 SIGCLD 以在 child 完成后执行某些操作。它在 IRB 上工作,但当我作为 ruby​​ 脚本执行时则不起作用。

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code"}

当我从 IRB 运行上述代码时,两行都会被打印,但是当我将其作为 ruby​​ 脚本运行时,陷阱过程中的行不会显示。

最佳答案

IRB 为您提供了一个外循环,这意味着 ruby​​ 进程不会退出,直到您决定终止它。您的 ruby​​ 脚本的问题在于,主进程正在完成并在您的 child 有机会捕获信号之前杀死您的 child (哎呀)。

我的猜测是,这是一个测试脚本,您想要的程序很可能不会出现父进程先于子进程完成的情况。要查看陷阱在普通 ruby​​ 脚本中的工作情况,请在末尾添加 sleep :

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code"}
sleep 3

要填充 $? 全局变量,您应该显式等待子进程退出:

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code #{$? >> 8}" }
Process.wait

如果您确实希望子进程在父进程终止后运行,那么您需要一个守护进程(双叉)。

关于ruby - 作为脚本调用时 trap 不工作;但适用于 IRB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466690/

相关文章:

ruby-on-rails - 如何调试在 IRB 控制台的 delayed_job 任务中运行的代码?

ruby - 中间人:在构建中包含一个 .scss 文件,但不编译它

Bash:如何在使用微调器时获取命令的退出代码?

ruby - 工头开始返回未找到的包

ruby - 安装 openssl Ruby gem 失败,因为找不到 Ubuntu 中安装的 openssl

python - 是否可以通过 C++ 扩展强制多个 python 进程共享相同的内存?

linux - execv() 和 fork() 的时间浪费

python - 如何使用多处理将函数应用于二维 numpy 数组

linux - sed 不像其他 linux 命令那样显示退出状态

linux - 如果父进程仍在运行,子进程的 PID 是否可以重用?