6

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>'

Process.uid=または、メソッドを使用して uid またはプロセスを変更すると、同じエラーで失敗します。Ruby プログラムをルートとして実行すると問題なく動作し、実行時にプロセスの UID を変更しません。

ただし、Ubuntu やその他のディストリビューションのシェルでは、setsid(参照: http://linux.die.net/man/2/setsid ) プログラムはスーパーユーザー権限を必要としません。

プログラムのセッションをリセットすることを理解していstdsidます。これは、プロセスをデーモン化するときにも役立ちます。私のコードでは、セッションをリセットしながら、UID を変更してデーモン化しようとしています。

したがって、 OS のようなほとんどの UNIX 上Process.setsidのプログラムは必要としないのに、なぜ上記の特権が必要なのか興味があります。setsid

4

1 に答える 1

5

Process.setsidは POSIX setsid(2)の薄いラップであり、man ページには次のように記載されています。

エラー

EPERM

任意のプロセスのプロセス グループ ID は、呼び出しプロセスの PID と同じです。したがって、特に、呼び出しプロセスがすでにプロセス グループ リーダーである場合、setsid() は失敗します。

プログラムが実行されるとき、それはすでにグループ リーダーです。デーモン化するときは、デーモンの新しいプロセスをフォークする必要があります。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) プログラムは、setsid(2) を呼び出す前に fork するため、EPERM エラーを受け取りません。31行目はこちら

于 2012-06-21T20:38:35.800 に答える