module Process

[edit]

要約

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

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

ユーザ ID・グループ ID を操作するシステムコールを直接呼ぶために Process::Sys が提供されています。ポータブルにユーザ ID・グループ ID を操作するためのモジュール Process::UID, Process::GID も提供されています。

目次

特異メソッド
モジュール関数
定数

特異メソッド

abort -> ()[permalink][rdoc][edit]
abort(message) -> ()

関数 Kernel.#abort と同じです。

[PARAM] message:
終了時のメッセージを文字列で指定します。
exec(command, *args) -> ()[permalink][rdoc][edit]

カレントプロセスを与えられた外部コマンドで置き換えます。

引数の解釈

引数が一つだけ与えられた場合、command が shell のメタ文字

  * ? {} [] <> () ~ & | \ $ ; ' ` " \n

を含む場合、shell 経由で実行されます。そうでなければインタプリタから直接実行されます。

引数が複数与えられた場合、第 2 引数以降は command に直接渡され、インタプリタから直接実行されます。

第 1 引数が 2 要素の配列の場合、第 1 要素の文字列が実際に起動するプログラムのパスで、第 2 要素が「みせかけ」のプログラム名になります。

MSDOS 環境の場合、command はサブシェル経由で実行されます。そうでない場合、command は exec(2) を使用して実行されるので元のプログラムからいくつかの環境を引き継ぎます。

[PARAM] command:
実行する外部コマンド。
[PARAM] args:
command に渡す引数。
exec "echo *"       # echoes list of files in current directory
# never get here


exec "echo", "*"    # echoes an asterisk
# never get here
exit(status = true) -> ()[permalink][rdoc][edit]

プロセスを終了します。関数 Kernel.#exit と同じです。

[PARAM] status:
終了ステータスを boolean か整数で指定します。true の場合は成功を、false は失敗を意味します。

[SEE_ALSO] exit(3)

exit!(status = false) -> ()[permalink][rdoc][edit]

関数 Kernel.#exit! と同じです。

[PARAM] status:
終了ステータスを boolean か整数で指定します。true の場合は成功を、false は失敗を意味します。

[SEE_ALSO] _exit(2)

fork -> Integer | nil[permalink][rdoc][edit]
fork { ... } -> Integer | nil

子プロセスを生成します。関数 Kernel.#fork と同じです。

[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] fork(2)

last_status -> Process::Status | nil[permalink][rdoc][edit]

カレントスレッドで最後に終了した子プロセスのステータスを返します。

変数 $? の値と同じです。

Process.wait Process.spawn("ruby", "-e", "exit 13")
Process.last_status   # => #<Process::Status: pid 4825 exit 13>

カレントスレッドで子プロセスを実行したことがない場合は nil を返します。

Process.last_status   # => nil

[SEE_ALSO] Process::Status

[SEE_ALSO] $?

spawn(cmd, *arg) -> Integer[permalink][rdoc][edit]

関数 Kernel.#spawn と同じです。

[PARAM] cmd:
Kernel.#spawn と同じです。
[PARAM] arg:
Kernel.#spawn と同じです。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

モジュール関数

argv0 -> String[permalink][rdoc][edit]

現在実行中の Ruby スクリプトの名前を表す文字列です。$0 を更新しても本メソッドの戻り値への影響はありません。

本メソッドは 2.1 以降でグローバル変数を用いないで現在実行中の Ruby スクリプトの名前を表す文字列を取得する手段として提供されました。

[SEE_ALSO] Process.#setproctitle, $0

clock_gettime(clock_id, unit=:float_second) -> Float | Integer[permalink][rdoc][edit]

POSIX の clock_gettime() 関数の時間を返します。

例:

p Process.clock_gettime(Process::CLOCK_MONOTONIC) #=> 896053.968060096
[PARAM] clock_id:
クロックの種類を以下の定数のいずれかで指定します。サポートされている定数は OS やバージョンに依存します。
Process::CLOCK_REALTIME

SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12

Process::CLOCK_MONOTONIC

SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12

Process::CLOCK_PROCESS_CPUTIME_ID

SUSv3 to 4, Linux 2.5.63, OpenBSD 5.4, macOS 10.12

Process::CLOCK_THREAD_CPUTIME_ID

SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12

Process::CLOCK_VIRTUAL

FreeBSD 3.0, OpenBSD 2.1

Process::CLOCK_PROF

FreeBSD 3.0, OpenBSD 2.1

Process::CLOCK_REALTIME_FAST

FreeBSD 8.1

Process::CLOCK_REALTIME_PRECISE

FreeBSD 8.1

Process::CLOCK_REALTIME_COARSE

Linux 2.6.32

Process::CLOCK_REALTIME_ALARM

Linux 3.0

Process::CLOCK_MONOTONIC_FAST

FreeBSD 8.1

Process::CLOCK_MONOTONIC_PRECISE

FreeBSD 8.1

Process::CLOCK_MONOTONIC_COARSE

Linux 2.6.32

Process::CLOCK_MONOTONIC_RAW

Linux 2.6.28, macOS 10.12

Process::CLOCK_MONOTONIC_RAW_APPROX

macOS 10.12

Process::CLOCK_BOOTTIME

Linux 2.6.39

Process::CLOCK_BOOTTIME_ALARM

Linux 3.0

Process::CLOCK_UPTIME

FreeBSD 7.0, OpenBSD 5.5

Process::CLOCK_UPTIME_FAST

FreeBSD 8.1

Process::CLOCK_UPTIME_RAW

macOS 10.12

Process::CLOCK_UPTIME_RAW_APPROX

macOS 10.12

Process::CLOCK_UPTIME_PRECISE

FreeBSD 8.1

Process::CLOCK_SECOND

FreeBSD 8.1

SUS は Single Unix Specification を意味しており、 SUS は POSIX と POSIX の一部で定義されている clock_gettime を含みます。 SUS では CLOCK_REALTIME は必須ですが、CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID は任意です。

さらに clock_id はいくつかのシンボルを受け付けます。それらは clock_gettime() をエミュレーションします。

たとえば、Process::CLOCK_REALTIME は clock_gettime() がない場合は :GETTIMEOFDAY_BASED_CLOCK_REALTIME と定義されています。

CLOCK_REALTIME のエミュレーション:

:GETTIMEOFDAY_BASED_CLOCK_REALTIME

SUS で定義されている gettimeofday() を使います。 (しかし SUSv4 で obsoleted になっています) 精度は1マイクロ秒です。

:TIME_BASED_CLOCK_REALTIME

ISO C で定義されている time() を使います。精度は1秒です。

CLOCK_MONOTONIC のエミュレーション:

:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC

Darwin で利用可能な mach_absolute_time() を使います。精度は CPU に依存します。

:TIMES_BASED_CLOCK_MONOTONIC

POSIX で定義されている times() の結果を使います。 POSIX では「times() は過去のある時点 (例えばシステムの起動時刻) からの経過クロック数 (clock tick) で実際に経過時間を返します」と定義されています。例えば GNU/Linux では jiffies に基づいた値を返し、monotonic (単調増加が保証されていて、巻き戻ったりしない) です。しかし 4.4BSD では gettimeofday() を使い、monotonic ではありません。 (ただし FreeBSD では clock_gettime(CLOCK_MONOTONIC) を代わりに使います。) 精度はクロック数 (clock tick) です。「getconf CLK_TCK」コマンドで1秒あたりのクロック数を表示できます。 (古いシステムでは、1秒あたりのクロック数は HZ マクロで定義されています。) もし1秒あたりのクロック数が 100 かつ clock_t が32ビット整数型の場合、精度は10ミリ秒で497日以上を表すことはできません。

CLOCK_PROCESS_CPUTIME_ID のエミュレーション:

:GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID

SUS で定義されている getrusage() を使います。 getrusage() を RUSAGE_SELF と一緒に使うと、(子プロセスの時間をのぞいた) getrusage() を呼び出したプロセスだけの CPU 時間が得られます。ユーザー時間 (ru_utime) とシステム時間 (ru_stime) を足した結果を返します。精度は1マイクロ秒です。

:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID

POSIX で定義されている times() を使います。ユーザー時間 (tms_utime) と システム時間 (tms_stime) を足した結果を返します。 tms_cutime と tms_cstime は子プロセスの時間を含みません。精度はクロック数 (clock tick) です。「getconf CLK_TCK」コマンドで1秒あたりのクロック数を表示できます。 (古いシステムでは、1秒あたりのクロック数は HZ マクロで定義されています。) もし1秒あたりのクロック数が100なら、精度は10ミリ秒です。

:CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID

ISO C で定義されている clock() を使います。精度は 1/CLOCKS_PER_SEC です。 CLOCKS_PER_SEC は time.h で定義されているC言語のマクロです。 SUS では CLOCKS_PER_SEC は 1000000 と定義されています。ただし、Unix 以外のシステムでは異なる値に定義されているかもしれません。 SUS で定義されているように CLOCKS_PER_SEC が 1000000 なら、精度は1マイクロ秒です。 CLOCKS_PER_SEC が 1000000 かつ clock_t が32ビット整数型の場合、72分以上を表すことはできません。

[PARAM] unit:
返値の型を指定します。
:float_second

Float の秒 (デフォルト)

:float_millisecond

Float のミリ秒

:float_microsecond

Float のマイクロ秒

:second

Integer の秒

:millisecond

Integer のミリ秒

:microsecond

Integer のマイクロ秒

:nanosecond

Integer のナノ秒

基になる関数 clock_gettime() はナノ秒を返します。 Float オブジェクト (IEEE 754 double) は CLOCK_REALTIME の結果を表すには不十分です。正確なナノ秒が必要なら、unit に :nanosecond を使ってください。

返値のオリジン(0)は様々です。例えば、システムの起動時刻、プロセス起動時刻、エポックなどです。

CLOCK_REALTIME のオリジンはエポック (1970-01-01 00:00:00 UTC) と定義されています。しかし、システムによってうるう秒をカウントするかどうかが異なります。そのため、結果はシステムによって解釈が異なります。 CLOCK_REALTIME よりも Time.now をおすすめします。

[EXCEPTION] Errno::EINVAL:
clock_id がサポートされていない場合に発生します。

[SEE_ALSO] Time.now

daemon(nochdir = nil, noclose = nil) -> 0[permalink][rdoc][edit]

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

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

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

[PARAM] nochdir:
true を指定した場合、カレントディレクトリを移動しません。
[PARAM] noclose:
true を指定した場合、標準入力・標準出力・標準エラー出力を変更しません。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
[EXCEPTION] Errno::EXXX:
失敗した場合に発生します。
detach(pid) -> Thread[permalink][rdoc][edit]

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

[PARAM] pid:
子スレッドのプロセス ID を整数で指定します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
pid = fork {
  # child
  sleep 3
}

p pid # => 7762
th = Process.detach(pid)
p th.value
# => #<Process::Status: pid 7762 exit 0>
egid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] getegid(2)

egid=(gid)[permalink][rdoc][edit]

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

動作の詳細はプラットフォームに依存します。実効グループ ID 以外のグループ ID も変更されるかも知れません。

[PARAM] gid:
実効グループ ID を整数で指定します。
[EXCEPTION] Errno::EXXX:
権限がない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] Process::GID.#eid=

euid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] geteuid(2)

euid=(uid)[permalink][rdoc][edit]

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

動作の詳細はプラットフォームに依存します。実効ユーザ ID 以外のユーザ ID も変更されるかも知れません。

[PARAM] uid:
実効ユーザ ID を整数で指定します。
[EXCEPTION] Errno::EXXX:
権限がない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] Process::UID.#eid=

getpgid(pid) -> Integer[permalink][rdoc][edit]

プロセス ID が pid であるプロセスのプロセスグループ ID を整数で返します。

[PARAM] pid:
プロセス ID を整数で指定します。0 の時はカレントプロセス ID を指定したのと同じです。
[EXCEPTION] Errno::EXXX:
プロセスグループの取得に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] getpgid(2)

getpgrp -> Integer[permalink][rdoc][edit]

現在のプロセスのプロセスグループ ID を整数で返します。

[EXCEPTION] Errno::EXXX:
プロセスグループの取得に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] getpgrp(2)

getpriority(which, who) -> Integer[permalink][rdoc][edit]

which に従いプロセス、プロセスグループ、ユーザのいずれかの現在のプライオリティを整数で返します。

[PARAM] which:
プライオリティの種類を次の定数で指定します。 Process::PRIO_PROCESS, Process::PRIO_PGRP, Process::PRIO_USER
[PARAM] who:
which の値にしたがってプロセス ID、プロセスグループ ID、ユーザ ID のいずれかを整数で指定します。
[EXCEPTION] Errno::EXXX:
プライオリティの取得に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] getpriority(2)

getrlimit(resource) -> [Integer][permalink][rdoc][edit]

カレントプロセスでのリソースの制限値を、整数の配列として返します。返り値は、現在の制限値 cur_limit と、制限値として設定可能な最大値 max_limit の配列 [cur_limit, max_limit] です。

それぞれの limit が Process::RLIM_INFINITY と等しい場合、リソースに制限がないことを意味します。

[PARAM] resource:
リソースの種類を示す定数を指定します。指定できる定数はシステムに依存します。
[EXCEPTION] Errno::EXXX:
リソースの制限値の取得が失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

引数 resource で有効な定数は以下のとおりです。

Process::RLIMIT_CORE

core ファイルのサイズ (バイト) (SUSv3)

Process::RLIMIT_CPU

プロセスの CPU 時間 (秒) (SUSv3)

Process::RLIMIT_DATA

プロセスのデータ領域のサイズ (バイト) (SUSv3)

Process::RLIMIT_FSIZE

プロセスが生成するファイルのサイズ (バイト) (SUSv3)

Process::RLIMIT_NOFILE

プロセスがオープンできるファイルの数 (SUSv3)

Process::RLIMIT_STACK

プロセスのスタック領域のサイズ (バイト) (SUSv3)

Process::RLIMIT_AS

プロセスの仮想メモリサイズ (バイト) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite))

Process::RLIMIT_MEMLOCK

mlock(2) でロックできるトータルのサイズ (バイト) (4.4BSD, GNU/Linux)

Process::RLIMIT_NPROC

そのユーザのプロセスの最大数 (4.4BSD, GNU/Linux)

Process::RLIMIT_RSS

使用できる実メモリの最大サイズ (バイト) (4.2BSD, GNU/Linux)

Process::RLIMIT_SBSIZE

ソケットバッファのサイズ (バイト) (NetBSD, FreeBSD)

例:

include Process
p lim = getrlimit(RLIMIT_STACK)                                        #=> [8388608, 18446744073709551615]
p lim.map{|i| i == RLIM_INFINITY ? "unlimited" : "#{i/(1024**2)}MB" }  #=> ["8MB", "unlimited"]

[SEE_ALSO] Process.#setrlimit, getrlimit(2)

getsid(pid = 0) -> Integer[permalink][rdoc][edit]

引数 pid で指定されたプロセスのセッション ID を返します。

[PARAM] pid:
プロセス ID を整数で指定します。省略した場合、0 を指定した場合は現在のプロセスの ID を指定した場合と同じ動作になります。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
Process.getsid()              # => 27422
Process.getsid(0)             # => 27422
Process.getsid(Process.pid()) # => 27422

[SEE_ALSO] getsid(2)

gid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] getgid(2)

gid=(gid)[permalink][rdoc][edit]

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

動作の詳細はプラットフォームに依存します。実グループ ID 以外のグループ ID も変更されるかも知れません。

[PARAM] gid:
実グループ ID を整数で指定します。
[EXCEPTION] Errno::EXXX:
権限がない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] Process::GID

groups -> [Integer][permalink][rdoc][edit]

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

返される配列の最大要素数は Process.#maxgroups です。

このメソッドは getgroups(2) の単純なラッパーです。このことは以下の特徴がプラットフォームに依存することを意味します。

  • 結果がソートされているかどうか
  • 結果が実効グループ ID を含むかどうか
  • グループ ID が重複している可能性があるかどうか

ソート済みで重複のないグループ ID の配列の取得は以下のようにできます:


Process.groups.uniq.sort
[EXCEPTION] Errno::EXXX:
Process.#maxgroups が実際に返される補助グループ ID の数よりも少ない値を設定していると発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

Process.groups   #=> [27, 6, 10, 11]

[SEE_ALSO] getgroups(2)

groups=(gids)[permalink][rdoc][edit]

補助グループを設定します。

root だけがこのメソッドを呼ぶことができます。

[PARAM] gids:
補助グループ ID の配列を指定します。補助グループ ID は整数かグループ名を表す文字列です。
[EXCEPTION] ArgumentError:
設定する補助グループ ID の数が Process.#maxgroups の数を越えている場合に発生します。
[EXCEPTION] Errno::EXXX:
権限がない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] setgroups(2)

initgroups(user, group) -> [Integer][permalink][rdoc][edit]

user が属するグループのリストを更新し、group をそのリストに加えます。

このメソッドを呼ぶには root 権限が必要です。

[PARAM] user:
ユーザ名を表す文字列で指定します。
[PARAM] group:
ユーザグループ ID を整数で指定します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
kill(signal, pid, *rest) -> Integer[permalink][rdoc][edit]

pid で指定されたプロセスにシグナルを送ります。signal はシグナル番号(整数)かその名前(文字列またはSymbol)で指定します。全てのシグナル送信に成功した場合、指定した pid の総数を返します。

[PARAM] signal:
シグナルをシグナル番号(整数)かその名前(文字列またはSymbol)で指定します。負の値を持つシグナル(あるいはシグナル名の前に-)を指定すると、プロセスではなくプロセスグループにシグナルを送ります。
[PARAM] pid:
シグナルを送りたいプロセスのプロセス ID を整数で指定します。ただし、0 以下の場合は以下のような意味になります。
  • 0 の場合はカレントプロセスのプロセスグループにシグナルを送ります。
  • -1 の場合はシステム上の全てのプロセスにシグナルを送ります。
  • それ以外の負の整数を与えるとプロセスではなくプロセスグループにシグナルを送ります。 負の整数はプロセスグループ ID にマイナスを付けたものと見なされます。
[PARAM] rest:
プロセス ID を整数で指定します。
[EXCEPTION] ArgumentError:
存在しないシグナルを指定した場合に発生します。
[EXCEPTION] Errno::EXXX:
シグナル送信に失敗した場合に発生します。

[SEE_ALSO] Kernel.#trap, kill(2)

maxgroups -> Integer[permalink][rdoc][edit]
maxgroups=(num)

設定できる補助グループ ID の数を指定します。

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

[PARAM] num:
整数を指定します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
pid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] getpid(2)

ppid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] getppid(2)

setpgid(pid, pgrp) -> 0[permalink][rdoc][edit]

プロセス ID が pid であるプロセスのプロセスグループを pgrp に設定します。

[PARAM] pid:
プロセス ID を整数で指定します。pid が 0 の時はカレントプロセスの ID を指定したのと同じです。プロセスグループの設定に成功した場合は 0 を返します。
[PARAM] pgrp:
プロセスグループ ID を整数で指定します。pgrp が 0 の時は pid を指定したのと同じです。
[EXCEPTION] Errno::EXXX:
プロセスグループの設定に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] setpgid(2)

setpgrp -> 0[permalink][rdoc][edit]

カレントプロセスの ID と同じ ID をもつプロセスグループを作成し、カレントプロセスをそのリーダーにします。 Process.#setpgid(0, 0) と同じです。

[EXCEPTION] Errno::EXXX:
プロセスグループの設定に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
fork do
  p [Process.pid, Process.getpgrp]
  p Process.setpgrp
  p [Process.pid, Process.getpgrp]
end
Process.wait
#=>
  [3427, 3426]
  0
  [3427, 3427]

[SEE_ALSO] setpgrp(2)

setpriority(which, who, prio) -> 0[permalink][rdoc][edit]

プロセス、プロセスグループ、ユーザのいずれかの現在のプライオリティを設定します。プライオリティの設定に成功した場合は 0 を返します。

[PARAM] which:
プライオリティを設定する対象の種類を以下の定数のいずれかで指定します。
[PARAM] who:
which の値にしたがってプロセス ID、プロセスグループ ID、ユーザ ID のいずれかを整数で指定します。
[PARAM] prio:
プライオリティを -20 から 20 までの整数で設定します。小さな値はプライオリティが高いことを意味し、大きな値はプライオリティが低いことを意味します。
[EXCEPTION] Errno::EXXX:
プライオリティの設定に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

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

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

[SEE_ALSO] setpriority(2)

setproctitle(title) -> String[permalink][rdoc][edit]

ps(1) が出力する現在実行中の Ruby スクリプトの名前を引数 title で指定した文字列に変更します。

OS によっては何も行われません。また、処理結果に関係なく例外は発生しません。サポートされる OS ではない場合であっても NotImplementedError が発生する事はありません。本メソッドを実行しても $0 への影響はありません。

Process.setproctitle('myapp: worker #%d' % worker_id)

本メソッドは 2.1 以降でグローバル変数を用いないで現在実行中の Ruby スクリプトの名前を表す文字列を設定する手段として提供されました。

[SEE_ALSO] Process.#argv0, $0

setrlimit(resource, cur_limit, max_limit) -> nil[permalink][rdoc][edit]
setrlimit(resource, limit) -> nil

カレントプロセスでのリソースの制限値を設定します。

[PARAM] resource:
リソースの種類を示す定数を指定します。指定できる定数はシステムに依存します。
[PARAM] limit:
resource によって意味が決まる制限値を表す整数もしくは定数を指定します。 soft limit と hard limit 両方にこの値が使われます。
[PARAM] cur_limit:
現在の制限値(soft limit)を表す整数もしくは定数を指定します。
[PARAM] max_limit:
soft limit として設定可能な最大値(hard limit)を表す整数もしくは定数を指定します。
[EXCEPTION] Errno::EXXX:
リソースの制限値の設定に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

引数 resource で有効な定数は以下のとおりです。

Process::RLIMIT_CORE

core ファイルのサイズ (バイト) (SUSv3)

Process::RLIMIT_CPU

プロセスの CPU 時間 (秒) (SUSv3)

Process::RLIMIT_DATA

プロセスのデータ領域のサイズ (バイト) (SUSv3)

Process::RLIMIT_FSIZE

プロセスが生成するファイルのサイズ (バイト) (SUSv3)

Process::RLIMIT_NOFILE

プロセスがオープンできるファイルの数 (SUSv3)

Process::RLIMIT_STACK

プロセスのスタック領域のサイズ (バイト) (SUSv3)

Process::RLIMIT_AS

プロセスの仮想メモリサイズ (バイト) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite))

Process::RLIMIT_MEMLOCK

mlock(2) でロックできるトータルのサイズ (バイト) (4.4BSD, GNU/Linux)

Process::RLIMIT_NPROC

そのユーザのプロセスの最大数 (4.4BSD, GNU/Linux)

Process::RLIMIT_RSS

使用できる実メモリの最大サイズ (バイト) (4.2BSD, GNU/Linux)

Process::RLIMIT_SBSIZE

ソケットバッファのサイズ (バイト) (NetBSD, FreeBSD)

引数 limit, cur_limit, max_limit で有効な定数は以下のとおりです。

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

Process.setrlimit(Process::RLIMIT_CORE,
                  Process.getrlimit(Process::RLIMIT_CORE)[1])

[SEE_ALSO] setrlimit(2)

setsid -> Integer[permalink][rdoc][edit]

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

[EXCEPTION] Errno::EXXX:
セッションの作成に失敗した場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] setsid(2)

times -> Process::Tms[permalink][rdoc][edit]

自身のプロセスとその子プロセスが消費したユーザ/システム CPU 時間の積算を Process::Tms オブジェクトで返します。時間の単位は秒で、浮動小数点数で与えられます。

[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] Process::Tms

uid -> Integer[permalink][rdoc][edit]

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

[SEE_ALSO] getuid(2)

uid=(id)[permalink][rdoc][edit]

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

動作の詳細はプラットフォームに依存します。実ユーザ ID 以外のユーザ ID も変更されるかも知れません。

[PARAM] id:
実ユーザ ID を整数で指定します。
[EXCEPTION] Errno::EXXX:
権限がない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。

[SEE_ALSO] Process::UID

wait(pid = -1, flags = 0) -> Integer | nil[permalink][rdoc][edit]
wait2(pid = -1, flags = 0) -> [Integer, Process::Status] | nil
waitpid(pid = -1, flags = 0) -> Integer | nil
waitpid2(pid = -1, flags = 0) -> [Integer, Process::Status] | nil

pid で指定される特定の子プロセスの終了を待ち、そのプロセスが終了した時に pid を返します。 wait2, waitpid2 は子プロセスの pid と終了ステータスを表す Process::Status オブジェクトの配列を返します。ノンブロッキングモードで子プロセスがまだ終了していない時には nil を返します。

$? に終了した子プロセスの Process::Status オブジェクトがセットされます。

[PARAM] pid:
子プロセスのプロセス ID を整数で指定します。 0 以上なら指定されたプロセス ID の子プロセスを待ちます。 0 なら呼び出し元のプロセスとプロセスグループ ID が同じ任意の子プロセスを待ちます。 -1 (省略時のデフォルト) は任意の子プロセスを待ちます。 -1 未満なら pid の絶対値とプロセスグループ ID が同じ任意の子プロセスを待ちます。
[PARAM] flags:
Process モジュールの定数 Process::WNOHANG(ノンブロッキングモード)と Process::WUNTRACED の論理和を指定します。省略したときの値は 0 です。ノンブロッキングモードで子プロセスがまだ終了していない時には nil を返します。waitpid(2)wait4(2) の実装されていないマシンでは flags はいつも nil または 0 を指定する必要があります。
[EXCEPTION] Errno::ECHILD:
子プロセスが存在しない場合に発生します。

pid = fork { sleep 1 }
Process.wait2 # => [70024, #<Process::Status: pid 70024 exit 0>]

[SEE_ALSO] wait(2), waitpid(2)

waitall -> [[Integer, Process::Status]][permalink][rdoc][edit]

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

$? には最後に終了した子プロセスの Process::Status オブジェクトが設定されます。

2.times {|n|
  Process.fork() { exit n }
}
p Process.waitall
#=> [[2766, #<Process::Status: pid=2766,exited(1)>], [2765, #<Process::Status: pid=2765,exited(1)>]]
warmup -> true[permalink][rdoc][edit]

RubyVMにアプリケーションの起動が終了したこと及び、アプリケーションの最適化に適したタイミングであることを通知します。

アプリケーションがプリフォークモデルでデプロイされる場合は、最初のフォークが行なわれる前に元のプロセスで呼び出しされることが推奨されます。本メソッドが行う最適化は実装依存であり、将来的に予告なく変更される可能性があります。

CRubyではメジャーGCを実行し以下のことをします:

  1. ヒープを圧縮します
  2. GCされなかった全ての新世代オブジェクトを古い世代に昇格します
  3. 全ての文字列のcoderange([m:String#valid_encoding]などで使われる文字列の内容とエンコーディングとの整合性の情報)を事前計算します
  4. すべての空のヒープページを解放し、解放したページ数だけ割当可能なページカウンター(heap_allocatable_pages)を増分します
  5. 空のmallocページを解放するためにmalloc_trimを呼び出します

定数

CLOCK_BOOTTIME -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_BOOTTIME_ALARM -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_MONOTONIC -> Integer | Symbol[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC です。システムによっては定義されていません。

CLOCK_MONOTONIC_COARSE -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_MONOTONIC_FAST -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_MONOTONIC_PRECISE -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_MONOTONIC_RAW -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_MONOTONIC_RAW_APPROX -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_PROCESS_CPUTIME_ID -> Integer | Symbol[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID です。システムによっては定義されていません。

CLOCK_PROF -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_REALTIME -> Integer | Symbol[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては :GETTIMEOFDAY_BASED_CLOCK_REALTIME です。システムによっては定義されていません。

CLOCK_REALTIME_ALARM -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_REALTIME_COARSE -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_REALTIME_FAST -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_REALTIME_PRECISE -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_SECOND -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_THREAD_CPUTIME_ID -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_UPTIME -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_UPTIME_FAST -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_UPTIME_PRECISE -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_UPTIME_RAW -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_UPTIME_RAW_APPROX -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

CLOCK_VIRTUAL -> Integer[permalink][rdoc][edit]

Process.#clock_gettime で使われます。

システムによっては定義されていません。

PRIO_PGRP -> Integer[permalink][rdoc][edit]

対象とするプライオリティがプロセスグループプライオリティであることを表す定数です。

Process.#getpriority または Process.#setpriority で使われます。

PRIO_PROCESS -> Integer[permalink][rdoc][edit]

対象とするプライオリティがプロセスプライオリティであることを表す定数です。

Process.#getpriority または Process.#setpriority で使われます。

PRIO_USER -> Integer[permalink][rdoc][edit]

対象とするプライオリティがユーザプライオリティであることを表す定数です。

Process.#getpriority または Process.#setpriority で使われます。

RLIMIT_AS -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスの仮想メモリサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_CORE -> Integer[permalink][rdoc][edit]

リソースの種類が core ファイルのサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_CPU -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスの CPU 時間であることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_DATA -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスのデータ領域のサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_FSIZE -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスが生成するファイルのサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_MEMLOCK -> Integer[permalink][rdoc][edit]

リソースの種類が mlock(2) でロックできるトータルのサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_NOFILE -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスがオープンできるファイルの数であることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_NPROC -> Integer[permalink][rdoc][edit]

リソースの種類がユーザのプロセスの最大数であることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_RSS -> Integer[permalink][rdoc][edit]

リソースの種類が使用できる実メモリの最大サイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_SBSIZE -> Integer[permalink][rdoc][edit]

リソースの種類がソケットバッファのサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIMIT_STACK -> Integer[permalink][rdoc][edit]

リソースの種類がプロセスのスタック領域のサイズであることを示す定数です。

Process.#getrlimitProcess.#setrlimit で使われます。システムによっては定義されていません。

RLIM_INFINITY -> Integer[permalink][rdoc][edit]

リソースに制限がないことを意味する定数です。

Process.#getrlimitProcess.#setrlimit で使われます。

RLIM_SAVED_CUR -> Integer[permalink][rdoc][edit]

Process.#getrlimit, Process.#setrlimit で使われます。詳しくは setrlimit(2) を参照して下さい。

RLIM_SAVED_MAX -> Integer[permalink][rdoc][edit]

Process.#getrlimit, Process.#setrlimit で使われます。詳しくは setrlimit(2) を参照して下さい。

WNOHANG -> Integer[permalink][rdoc][edit]

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

WUNTRACED -> Integer[permalink][rdoc][edit]

Process.#waitpid の第二引数に指定するフラグです。このフラグが指定された場合、waitpid は停止しているだけで終了していない子プロセスのプロセス ID も返すようになります。 trace されている子プロセスの ID は返しません。

include Process
pid = fork{ Process.kill('SIGSTOP', Process.pid) }
p pid                          #=> 4336
p waitpid2(pid, WUNTRACED)     #=> [4336, #<Process::Status: pid=4336,stopped(SIGSTOP=19)>]

[SEE_ALSO] waitpid(2)