加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:18:11 所属栏目:百科 来源:网络整理
导读:在 Ruby中,如果以非超级用户身份运行,则对Process.setsid的调用将失败并显示“Operation not allowed”错误.尝试: $irbirb(main):001:0 Process.setsidErrno::EPERM: Operation not permitted from (irb):1:in `setsid' from (irb):1 from ~/.rbenv/version
在 Ruby中,如果以非超级用户身份运行,则对Process.setsid的调用将失败并显示“Operation not allowed”错误.尝试:

$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程序都不需要.

解决方法

Process.setsid是POSIX setsid(2)的精简包装,其手册页说:

Errors

EPERM

The process group ID of any process equals the PID of the calling
process. Thus,in particular,setsid() fails if the calling process is
already a process group leader.

当你的程序运行时,它已经是一个组长.在进行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

有关Ruby中POSIX守护进程的示例,请查看Rexec或unicorn.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读