在 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>'
或者,如果我更改 uid 或使用Process.uid=
方法的进程,它会失败并出现相同的错误。如果我以 root 身份运行 Ruby 程序,它可以正常工作,并且我不会在运行时更改进程的 UID。
但是,在 Ubuntu 或其他发行版的 shell 中,setsid
(参考: http: //linux.die.net/man/2/setsid)程序不需要超级用户权限。
我知道这会stdsid
重置程序的会话,这在守护进程时也很有用。在我的代码中,我试图更改 UID 并对其进行守护,同时还重置会话。
因此,我很好奇为什么Process.setsid
需要上述权限,而setsid
大多数 UNIX 等操作系统上的程序却不需要。