Joh*_*ler 10 ruby unix fork process-control
Ryan Tomayko用这篇关于使用Unix进程控制命令的文章引发了一场火灾风暴.
我们应该做更多这方面的事情.更多这一点.我在谈论fork(2),execve(2),pipe(2),socketpair(2),select(2),kill(2),sigaction(2)等等.这些是我们的朋友.他们非常想要帮助我们.
我有一些代码(delayed_jobDataMapper的一个克隆,我认为它适合这个,但我不清楚如何利用列出的命令.有关如何改进此代码的任何想法?
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self)
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
end
Run Code Online (Sandbox Code Playgroud)
啊,是的......“我们应该做更多这样的事情”而不解释它们各自的作用以及在什么情况下使用它们的危险。对于像您这样的东西,您甚至可能在不知道自己正在使用的情况下delayed_job使用。话虽这么说,其实这并不重要。Ryan 正在谈论用于预分叉服务器。 将用于将进程转变为守护进程。相同的系统调用,不同的目的。在前台运行(不带)与在后台运行(带)的性能差异可以忽略不计。forkforkforkdelayed_jobforkdelayed_jobforkfork
然而,如果您编写一个接受并发连接的服务器,那么现在 Ryan 的建议是正确的。
fork:创建原始进程的副本execve:停止执行当前文件并开始在同一进程中执行新文件(在 rake 任务中非常有用)pipe:创建一个管道(两个文件描述符,一个用于读取,一个用于写入)socketpair:像管道一样,但用于套接字select:让您等待一个或多个多个文件描述符准备好并超时kill:用于向进程发送信号sigaction:让您可以更改进程收到信号时发生的情况