В 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 `'
Или с той же ошибкой, если я изменю uid или процесс, используя метод Process.uid=
.Он отлично работает, если я запускаю программу Ruby от имени пользователя root и не меняю UID процесса во время выполнения.
Однако в оболочке Ubuntu или некоторых других дистрибутивов программа setsid
(ссылка: http://linux.die.net/man/2/setsid) не требует привилегии суперпользователя.
Насколько я понимаю, stdsid
сбрасывает сеанс программы, что также полезно при демонизации процесса. В моем коде я пытаюсь изменить UID, а также демонизировать его, а также сбросить сеанс.
Следовательно, мне любопытно, почему Process.setsid
требует указанных привилегий, а программа setsid
в большинстве UNIX-подобных ОС — нет.