在Ruby中,如果以非 super 用户身份运行,则对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>'
或者,如果我更改uid或使用
Process.uid=
方法的进程,则它将失败,并显示相同的错误。如果我以root身份运行Ruby程序,则效果很好,并且在运行时不更改进程的UID。但是,在Ubuntu或其他发行版的Shell中,
setsid
(引用:http://linux.die.net/man/2/setsid)程序不需要 super 用户特权。我知道
stdsid
会重置程序的 session ,这在守护进程时也很有用。在我的代码中,我试图更改UID并对其进行守护进程,同时还要重置 session 。因此,我很好奇
Process.setsid
为什么需要上述特权,而大多数UNIX之类的OS上的setsid
程序却不需要。 最佳答案
Process.setsid是POSIX setsid(2)的较薄包装,其手册页显示:
当您的程序运行时,它已经是组长。取消守护进程时,应该为守护程序分派(dispatch)一个新进程。派生后,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
关于ruby - 为什么Process.setsid在ruby中需要root特权?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11140452/