【问题标题】:Linux run a child process with redirection without spawning a new processLinux 运行带有重定向的子进程而不产生新进程
【发布时间】:2011-04-20 19:21:07
【问题描述】:

我正在使用 ruby​​ 启动后台服务。我存储此服务的 PID 以便稍后终止它。假设为简单起见,我需要运行后台服务"sleep 1000"。我使用这个命令,它工作正常

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

ps  
7845 pts/15   00:00:00 sleep

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

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

这里child_pid是一个sh进程的PID,sleep进程取另一个PID。

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

对此有何解释?

【问题讨论】:

    标签: ruby linux shell


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 2012-01-16
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多