2011-04-20 166 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子進程中的重定向。

相關問題