首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Process.setsid在ruby中需要root权限?

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

Stack Overflow用户
提问于 2012-06-21 22:31:11
回答 1查看 1.9K关注 0票数 6

在Ruby中,如果以非超级用户身份运行,则对Process.setsid的调用将失败,并显示“不允许操作”错误。尝试:

代码语言:javascript
复制
$ 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程序却不需要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 04:38:36

Process.setsid是对POSIX setsid(2)的简单概括,它的手册页上写着:

错误

EPERM

任何进程的进程组ID都等于调用进程的PID。因此,如果调用进程已经是进程组领导者,则setsid()将失败。

当你的程序运行时,它已经是一个组领导者了。当去内存时,你需要为你的守护进程派生一个新的进程。派生后,Process.setsid工作时不会出现EPERM错误:

代码语言:javascript
复制
$ 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中的POSIX守护进程的例子。

setsid(1)程序没有得到EPERM错误,因为它在调用setsid(2)之前派生。请参阅line 31 here

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11140452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档