为什么Process.setsid需要ruby中的root权限?

时间:2012-06-21 14:31:11

标签: ruby process daemon root

在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>

1 个答案:

答案 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

请查看Rexecunicorn以获取Ruby中POSIX守护程序的示例。

setsid(1)程序没有得到EPERM错误,因为它在调用setsid(2)之前分叉。见line 31 here