Linux使用重定向运行子进程,而不会生成新进程

时间:2011-04-20 19:21:08

标签: ruby linux shell

我正在使用ruby来启动后台服务。我为此服务存储PID以便稍后终止它。简单来说,我需要运行后台服务"sleep 1000"。我使用此命令,它可以正常工作

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 个答案:

答案 0 :(得分:1)

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