gpt4 book ai didi

ruby - Linux 使用重定向运行子进程而不产生新进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:09 25 4
gpt4 key购买 nike

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

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

ps
7845 pts/15 00:00:00 sleep

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

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

有什么解释吗?

最佳答案

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

关于ruby - Linux 使用重定向运行子进程而不产生新进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5735524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com