我需要从Ruby脚本运行一组任务,但是一个特定的任务总是在退出之前等待STDIN上的EOF。
显然,这会导致脚本在等待子进程结束时挂起。
我有子进程的进程ID,但没有管道或任何类型的句柄。如何打开进程的STDIN句柄以向其发送EOF?
答案 0 :(得分:8)
编辑:鉴于您没有启动脚本,我遇到的解决方案是在使用gem时将$ stdin置于您的控制之下。我建议像:
old_stdin = $stdin.dup
# note that old_stdin.fileno is non-0.
# create a file handle you can use to signal EOF
new_stdin = File::open('/dev/null', 'r')
# and make $stdin use it, instead.
$stdin.reopen(new_stdin)
new_stdin.close
# note that $stdin.fileno is still 0, though now it's using /dev/null for input.
# replace with the call that runs the external program
system('/bin/cat')
# "cat" will now exit. restore the old state.
$stdin.reopen(old_stdin)
old_stdin.close
<击>
如果您的ruby脚本正在创建任务,则可以使用IO::popen
。例如,cat
,在没有参数的情况下运行时,会在退出之前等待stdin上的EOF,但是您可以运行以下命令:
f = IO::popen('cat', 'w')
f.puts('hello')
# signals EOF to "cat"
f.close
击> <击> 撞击>