3

rake taskスレッド内でスレッドを起動し、タスクが完了したときにスレッドを強制終了するにはどうすればよいですか。

基本的に、私はrake taskjekyll サイトをテストするために を書いています。サーバーを起動し、他のタスクを実行し、タスクが完了したらスレッドを破棄できるようにしたいと考えています。これが私がこれまでに持っているものです:

task :test_site do
  `ejekyll --server`
  `git -Xdn`
  if agree( "Clean all ignored files?")
    git -Xdf
  end
end

残念ながら、私が知っている唯一の停止方法jekyll --serverは、を使用することctrl cです。jekyll --serverレーキ タスクを終了しないマナーで aを停止する方法を聞いてうれしいですが、質問は特にスレッド化とレーキ タスクについて尋ねているので、コメントしてください。

4

1 に答える 1

3

スレッドではなく、Process.spawn必要です。これは新しいプロセスであり、既存のプロセス内の実行スレッドではありません。PID が返されるのでProcess.kill(:QUIT, pid)、生成されたプロセスを強制終了するために使用する方法を送信するだけです。

pid = Process.spawn(
  "ejekyll", "--server",
  out: "/dev/null",
  err: "/dev/null"
)

# you may need to add a short sleep() here

# other stuff

Process.kill(:QUIT, pid) && Process.wait

フォアグラウンドで実行するコマンド ライン オプションがある場合ejekyllは、それを使用することをお勧めします。それ以外の場合は、自己デーモン化する場合、デーモンを識別して強制終了するために、PID ファイルの保存場所を知る必要があります。

于 2012-05-05T01:33:09.883 に答える