为什么Process.setsid需要ruby中的root权限?
在
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)的精简包装,其手册页说:
当你的程序运行时,它已经是一个组长.在进行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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |