Ruby はスクリプトの終端に達した場合や捕捉していない例外が発生した場合に終了します(関数 Kernel.#exit や Kernel.#abort 、メインスレッドに対する Thread.kill などは SystemExit 例外を発生させます)。終了時には以下の処理が順に実行されます。
- すべてのスレッドを Thread.kill する。
- Ruby の疑似シグナル SIGEXIT のハンドラが登録されていればそれを実 行する(Kernel.#trap を参照)。
- 制御構造/END ブロック(END { ... } または関数 Kernel.#at_exit で指定したブロック)が登録されていれば、 そのブロックを登録とは逆順に実行する。このブロックの実行中に発生 した大域脱出はそのブロックの処理を中断するが、スクリプトはまだ終 了しない。
- ObjectSpace.#define_finalizer により、ファイナ ライザが登録されていればそれらを実行する。実行順序は不定。 ファイナライザ実行中に発生した大域脱出はそのファイナライザの処理 を中断するが、スクリプトはまだ終了しない。
- exit(3) により終了する。このとき渡される終了ステータス値は終了方法によります。例えば、
- スクリプトの終端に達した場合は 0
- Kernel.#exit に渡した引数
- SystemExit による例外以外は 1
関数 Kernel.#exit! による終了は、_exit(2) を実行するだけで、上記の処理はいずれも行われません。