2011-04-20 183 views
1

我使用ruby启动后台服务。我为此服务存储PID以稍后终止。为了简单起见,我需要运行后台服务"sleep 1000"。我使用这个命令,它可以正常工作Linux在不产生新进程的情况下运行重定向子进程

child_pid = fork {exec("sleep 1000")} # => 7845 

ps 
7845 pts/15 00:00:00 sleep 

child_pid存储睡眠PID。但是,当我尝试将stdout重定向到文件(用于日志记录)时,它的行为有所不同。

child_pid = fork {exec("sleep 1000 > sleep.log")} # => 7829 

在这种情况下,child_pid是SH过程的PID,和睡眠过程需要另一个PID。

ps 
7829 pts/15 00:00:00 sh 
7832 pts/15 00:00:00 sleep 

对此有何解释?

回答

1

当您使用一个简单的命令时,它可以直接运行。重定向(和环境变量,和;和管道以及其他许多事情)不是简单的命令;它们是shell语法,因此Ruby启动一个shell来处理它们。如果您想要避免这种情况,您需要在exec之前通过在重定向文件上重新打开标准输出,在Ruby中执行fork ed子进程中的重定向。

相关问题