我正在尝试多个进程。我正在捕获 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/