在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 (reference:http://linux.die.net/man/2/setsid )程序不需要超级用户权限。
我知道stdsid会重置程序的会话,这在守护进程时也很有用。在我的代码中,我尝试更改UID并对其进行守护,同时重置会话。
因此,我很好奇为什么Process.setsid需要上述特权,而OSes等大多数UNIX上的setsid程序却不需要。
发布于 2012-06-22 04:38:36
Process.setsid是对POSIX setsid(2)的简单概括,它的手册页上写着:
错误
EPERM
任何进程的进程组ID都等于调用进程的PID。因此,如果调用进程已经是进程组领导者,则setsid()将失败。
当你的程序运行时,它已经是一个组领导者了。当去内存时,你需要为你的守护进程派生一个新的进程。派生后,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中的POSIX守护进程的例子。
setsid(1)程序没有得到EPERM错误,因为它在调用setsid(2)之前派生。请参阅line 31 here
https://stackoverflow.com/questions/11140452
复制相似问题