So-net無料ブログ作成
プログラム ブログトップ

RUBYメモ:コマンドのプロセス番号取得 [プログラム]

プログラムの話というかメモです。
Linux マシンで Ruby を使ってプロセス管理のプログラムを書いているのですが、外部コマンドを起動して自由にコントロールする必要がありました。
起動したコマンドにシグナルを送ろうと思った時に Ruby のバージョンが 1.9 以上なら spawn というコマンドが使えますが、そうでないので 、fork してプロセスを分岐してそこで system を起動してなんとかしたのですが、コードのサンプルが無く苦労したので載せます。


 # -----------------
 # コマンドのプロセスIDを得る
 # in:
 #  ppid : fork したプロセス ID
 def GetCmdPrcId(ppid)
  cnt = 2; # 適当調整必要
  while cnt > 0
   # ppid を親に持つプロセスのIDを返す
   ps1 = `ps --ppid #{ppid}`.chop;
   if ps1 =~ /^(\d+)/
    ppid = $1;
   else
    # 既に終了している
    return -1;
   end
   cnt = cnt - 1;
  end
  return ppid.to_i;
 end
-------
プロセステスト ruby
prcid = fork;
if prcid == nil
 system("(foolongtermprg > stdout.log) 2> stderr.log");
 exit 1;
end
sleep 2;
print "parent ",prcid,"\n";

cprcid = GetCmdPrcId(prcid);

Process.kill(:INT,cprcid); # コマンドに INT を送る
Process.waitpid(prcid);


GetCmdPrcId(fork したプロセス番号) でコマンドのプロセス番号が帰ります。
Linux では動作確認していますが、他は確認していません。たぶん、動きません。ps とか使ってますし。
素直に ruby 1.9 を入れられればいいのですが、あんまり環境が良くないです。

プログラム ブログトップ