在Ruby中,如果以非超级用户身份运行,则对Process.setsid
的调用将失败并显示“不允许操作”错误。尝试:
$ irb
irb(main):001:0> Process.setsid
Errno::EPERM: Operation not permitted
from (irb):1:in `setsid'
from (irb):1
from ~/.rbenv/versions/1.9.2-p290/bin/irb:12:in `<main>'
或者,如果我使用Process.uid=
方法更改uid或进程,则失败并返回相同的错误。如果我以root身份运行Ruby程序,它可以正常工作,并且我不会在运行时更改进程的UID。
但是,在Ubuntu或其他一些发行版的shell中,setsid
(引用:http://linux.die.net/man/2/setsid)程序不需要超级用户权限。
我理解stdsid
会重置程序的会话,这在守护进程时也很有用。在我的代码中,我试图更改UID以及守护它,同时还重置会话。
因此,我很好奇为什么Process.setsid
需要所述权限,而大多数UNIX上的setsid
程序都不需要。{/ p>
答案 0 :(得分:3)
Process.setsid是一个围绕POSIX setsid(2)的精简包装,其手册页说:
错误
EPERM
任何进程的进程组ID等于调用的PID 处理。因此,特别是,如果调用进程是setsid()失败 已经是一个流程小组组长。
当你的程序运行时,它已经是一个组长。在进行deamonizing时,您应该为您的守护进程分叉一个新进程。 fork {
}之后Process.setsid
没有EPERM错误
$ irb
irb> Process.setsid
Errno::EPERM: Operation not permitted
from (irb):1:in `setsid'
from (irb):1
from /Users/dbenhur/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
irb> fork { Process.setsid }
=> 3359
请查看Rexec或unicorn以获取Ruby中POSIX守护程序的示例。
setsid(1)程序没有得到EPERM错误,因为它在调用setsid(2)之前分叉。见line 31 here