Process

UNIX のプロセスを管理するモジュール。

Process がプロセスを表現するクラスではなく、プロセスに対する操作 をまとめたモジュールであることに注意してください。

モジュールメソッド:

Process.abort([message])

ruby 1.7 feature

関数 abort と同じです。

Process.daemon(nochdir=nil,noclose=nil)

ruby 1.9 feature

プロセスから制御端末を切り離し、 バックグラウンドにまわってデーモンとして動作させます。

カレントディレクトリを / に移動します。 ただし nochdir に真を指定したときにはこの動作は抑制され、 カレントディレクトリは移動しません。

標準入力・標準出力・標準エラー出力を /dev/null にリダイレクトします。 ただし noclose に真を指定したときにはこの動作は抑制され、 リダイレクトは行なわれません。

0を返します。

Process.detach(pid)

ruby 1.8 feature

子プロセス pid の終了を監視するスレッドを生成して返します。 生成したスレッドは子プロセスが終了した後に nil で終了します。 (指定した子プロセスが存在しなければ即座に nil で終了します)。

pid = fork {
  # child
  sleep 3
}

th = Process.detach(pid)
p th.value

# => nil
Process.exit([status])

ruby 1.7 feature

関数 exit と同じです。

Process.exit!([status])

関数 exit! と同じです。

Process.fork
Process.fork { ... }

関数 fork と同じです。

Process.getrlimit(resource) (ruby 1.8.5 feature)
Process.setrlimit(resource, cur_limit, max_limit) (ruby 1.8.5 feature)
Process.setrlimit(resource, limit) (ruby 1.8.5 feature)

resource で示すプロセスリソースの制限値の取得、設定を行います。

Process.setrlimit において単一の limit が指定された場合には、 cur_limit, max_limit の両方がその値として指定されたものとして扱います。 これらの引数には、resource によって決まる意味を持つ何らかの整数もしくは Process::RLIM_INFINITY, Process::RLIM_SAVED_CUR, Process::RLIM_SAVED_MAX のいずれかを指定します。

resource に指定する値は環境によりますが、以下のいずれかです。 システムによってはこれらのいくつかは存在しない場合があります。 詳細は、setrlimit(2) を参照してください。

getrlimit は、2値の配列 [cur_limit, max_limit] を返します。 setrlimit は、引数に指定した値を設定し、nil を返します。

リソースの制限値の取得、設定に失敗した場合、例外 Errno::EXXX が発生します。

以下の例は RLIMIT_CORE の制限を hard limit (max limit) まで引き上げ、可能なら core を残すようにします。

Process.setrlimit(Process::RLIMIT_CORE, Process.getrlimit(Process::RLIMIT_CORE)[1])
Process.spawn(cmd, [, arg, ...]) (ruby 1.9 feature)

関数 spawn と同じです。

モジュール属性:

これらは、モジュール関数です。

Process.egid

カレントプロセスの実効グループ ID を返します。

Process.egid=gid

カレントプロセスの実効グループ ID を設定します。gid を返します。

Process.euid

カレントプロセスの実効ユーザ ID を返します。

Process.euid=uid

カレントプロセスの実効ユーザ ID を設定します。uid を返します。

Process.gid

カレントプロセスの実グループ ID を返します。

Process.gid=gid

カレントプロセスの実グループ ID を設定します。gid を返します。

Process.groups

補助グループ ID の配列を返します(実効グループ ID を含むかも知れません)。

返される配列の最大要素数は 32 固定です(たぶんbug)。

Process.groups=gid_ary

補助グループを設定します。右辺の配列の要素はグループ ID かグループ 名を指定します。Process.groups の結果を返します。

設定する補助グループ ID の数が Process.maxgroups の 数を越えている場合、例外 ArgumentError が発生します。

Process.maxgroups
Process.maxgroups=num

設定できる補助グループ ID の数を指定します。実際に返される補助グルー プ ID の数よりも少ない値を設定していると、 Process.groups で例外が発生します。

Process.pid

カレントプロセスのプロセス ID を返します。変数 $$ の値と同じです。

Process.ppid

親プロセスのプロセス ID を返します。UN*X では実際の親プロセスが終 了した後は ppid は 1 (initの pid)になります。

Process.uid

プロセスの実ユーザ ID を返します。

Process.uid=uid

プロセスの実ユーザ ID を設定します。uid を返します。

モジュール関数:

Process.getpgid(pid)
Process.getpgrp([pid])

pid のプロセスのプロセスグループを返します。pid が 0 の時や省略された時はカレントプロセスを意味します。

プロセスグループの取得に失敗した場合は、例外 Errno::EXXX が 発生します。 *1

Process.getpriority(which, who)

プロセス、プロセスグループ、ユーザの現在のプライオリティを返 します(getpriority(2) 参照)。

Process モジュールは which として指定できる定数 Process::PRIO_PROCESS, Process::PRIO_PGRP, Process::PRIO_USER を定義しています。

who には、which の値にしたがってプロセス ID、プロセス グループ ID、ユーザ ID のいずれかを指定します。

プライオリティの取得に失敗した場合は、例外 Errno::EXXX が発 生します。

Process.initgroups(user, group)

ruby 1.8 feature

執筆者募集

(initgroups(3) 参照)

Process.kill(signal, pid ... )

pid で指定されたプロセスにシグナルを送ります。signal はシグナル番号か名前(文字列またはSymbol)で指定します。

負の値を持つシグナル(あるいはシグナル名の前に-)もしくは 負の値を持つプロセス番号を与えるとプロセスではなくプロセスグループにシグナルを送ります。 負の値のプロセス番号はプロセスグループ番号を符号反転したものと見なされます。

全てのシグナル送信に成功した場合、指定した pid の数を返します。 失敗した場合は例外 Errno::EXXX が発生します。

存在しないシグナルを指定した場合は、例外 ArgumentError が発 生します*2

trapも参照してください。

Process.setpgrp(pid, pgrp)
Process.setpgrp (ruby 1.7 feature)
Process.setpgid(pid, pgrp)

pid のプロセスグループを設定します。pid が 0 の時はカ レントプロセスを意味します。

プロセスグループの設定に成功した場合は 0 を返します。失敗した場合 は、例外 Errno::EXXX が発生します。

ruby 1.7 feature: version 1.7 では、Process.setpgrp は、引数を取りません。

Process.setpriority(which, who, prio)

プロセス、プロセスグループ、ユーザの現在のプライオリティを設 定します(setpriority(2) 参照)。

Process モジュールは which として指定できる定数 Process::PRIO_PROCESS, Process::PRIO_PGRP, Process::PRIO_USER を定義しています。

who には、which の値にしたがってプロセス ID、プロセス グループ ID、ユーザ ID のいずれかを指定します。

prio には、-20 から 20 の値を設定します。 小さな値はプライオリティが高いことを意味し、 大きな値はプライオリティが低いことを意味します。

プライオリティの設定に成功した場合は 0 を返します。失敗した場合は、 例外 Errno::EXXX が発生します。

以下の例は呼び出したプロセス自身のプライオリティを 10 に下げます。 (すでに 10 よりもプライオリティが低く、Errno::EACCES となった場合には無視して実行を続けます)

begin
  Process.setpriority(Process::PRIO_PROCESS, 0, 10)
rescue Errno::EACCES
end
Process.setsid()

新しいセッションを作成して、tty を切り離します。デーモンを簡単に作 ることができます。セッション ID を返します。

セッションの作成に失敗した場合は、例外 Errno::EXXX が発生します。

Process.times (ruby 1.7 feature)

自身のプロセスとその子プロセスが消費したユーザ/システム CPU 時間の 積算を Struct::Tms のオブジェクトとして返します。 Struct::Tms は以下のメンバを持つ構造体クラスです。

utime           # user time
stime           # system time
cutime          # user time of children
cstime          # system time of children

時間の単位は秒で、浮動小数点数で与えられます。詳細は times(3) を参照してください。

Process.wait
Process.wait2

子プロセスが終了するのを待ち、終了した子プロセスの pid を返します。 子プロセスが一つもなければ例外 Errno::ECHILD が 発生します。

wait2 は、その戻り値が pid と $? の配列であ る点だけが異なります。

ruby 1.7 feature: version 1.7 からは $?Process::Status オブジェクトで す。 Process.wait と Process.waitpid の実体は同じものになりました。 Process.wait2 と Process.waitpid2 の実体は同じものになりました。

Process.waitall (ruby 1.7 feature)

全ての子プロセスが終了するのを待ちます。

終了した子プロセスの pid と終了ステータス(Process::Status)の 配列を要素に持つ配列を返します。子プロセスがいない状態でこのメソッ ドを呼び出すと空の配列を返します。

$? には最後に終了した子プロセスの終了ステータスが 設定されます。

例:

3.times {|n|
  Process.fork() { exit n }
}
p ret = Process.waitall
p ret[-1][1]  , ret[-1][1].class 
p $?          , $?.class
=> [[5245, 256], [5244, 0], [5243, 512]]
   512
   Process::Status
   512
   Process::Status
Process.waitpid(pid[, flags])
Process.waitpid2(pid[, flags])

pid で指定される特定の子プロセスの終了を待ち、そのプロセスが 終了した時に pid を返します。子プロセスが存在しなければ例外 Errno::ECHILD が発生します。

flags には、Process モジュールの定数 Process::WNOHANG(ノンブロッキングモード)と Process::WUNTRACED の論理和を指定します。省略したときの値は 0 です。

ノンブロッキングモードで子プロセスがまだ終了していない時には nil を返します。waitpid(2)wait4(2) の実装されていないマシンでは flags はいつも nil または 0 を指定する必要があります。

waitpid2 は、その戻り値が pid と $? の配列 である点だけが異なります。

ruby 1.7 feature: version 1.7 からは $?Process::Status オブジェクト です。 Process.wait と Process.waitpid の実体は同じものになりました。 Process.wait2 と Process.waitpid2 の実体は同じものになりました。

定数:

Process::PRIO_PROCESS

Process.getpriority または Process.setpriority のプロセスプライオリティ指定。

Process::PRIO_PGRP

プロセスグループプライオリティ。

Process::PRIO_USER

ユーザプライオリティ。

Process::RLIMIT_AS
Process::RLIMIT_CORE
Process::RLIMIT_CPU
Process::RLIMIT_DATA
Process::RLIMIT_FSIZE
Process::RLIMIT_MEMLOCK
Process::RLIMIT_NOFILE
Process::RLIMIT_NPROC
Process::RLIMIT_RSS
Process::RLIMIT_SBSIZE
Process::RLIMIT_STACK
Process::RLIM_INFINITY
Process::RLIM_SAVED_CUR
Process::RLIM_SAVED_MAX

Process.getrlimit 参照。 執筆者募集

Process::WNOHANG

Process#waitpid の第二引数に指定するフラグで す。終了した子プロセスがない時に waitpid がブロックしません。

Process::WUNTRACED

Process#waitpid の第二引数に指定するフラグで す。子プロセスの停止によりステータスを報告していない子プロセスがあ る時に waitpid がブロックしません。

内部クラス:

Status (ruby 1.7 feature)

プロセスの終了ステータスを表現するクラスです。 Process::Status を参照してください。

内部モジュール:

UID (ruby 1.8 feature)
GID (ruby 1.8 feature)
Sys (ruby 1.8 feature)

プロセスのユーザ/グループ属性に関する操作をまとめたモジュール。モ ジュール UID、GID は各種 Unix システム間の違いを吸収したインタフェー スを提供します。

モジュール Sys は、システムコール相当のメソッドを提供します。

それぞれ、Process::UID, Process::GID, Process::Sys を参照してください。


*11.6.7 までは、getpgid() は例外を発生させていませんでした。 p Process.getpgid(1000000) # => -1
*2なお、Windows (mswin32, mingw32)では、INT ILL FPE SEGV TERM BREAK ABRT しか指定できません。ruby 1.7 feature KILL も指定できます



rubyist ML