rubyの中から実行したシェルコマンドを途中で止める

OSXで5GBの適当なファイルを作るとすると、以下のようにしてやることが出来る

$ mkfile 5g test.tmp

これをrubyなどのスクリプトから実行すると、以下のようにすることが出来る。

`mkfile 5g test.tmp`

これを実行するとrubyのプロセスにフォークしてシェルを実行していることが分かる

$ ruby test.rb
$ ps aux|grep ruby

$ pstree -p 16679
 \-+= 27855 fjwr38 tmux
   \-+= 15493 fjwr38 -zsh
     \-+= 16679 fjwr38 ruby test.rb
       \--- 16710 fjwr38 mkfile 5g test.tmp

このシェルの子プロセスだけを殺したい時、以下のようにspawnして適当にkillすれば良い

pid = Process.spawn({}, 'mkfile 5g test.tmp')
sleep 2
Process.kill(:INT, pid)

See Also

This blog is all about me doing nothing serious: Creating large dummy files for test

tatsu-zine.com