我正在使用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
对此有何解释?
答案 0 :(得分:1)
使用简单命令时,可以直接运行。重定向(和环境变量,;
和管道以及许多其他东西)不是简单的命令;它们是shell语法,因此Ruby启动一个shell来处理它们。如果要避免这种情况,则需要在fork
之前的exec
ed子进程中通过重定向文件重新打开标准输出,在Ruby中进行重定向。