0

こんにちは私はThorにサーバーを起動させたいです-Jekyll/Python/PHPなどそしてブラウザを開きます

ただし、開始はブロッキングタスクです。

Thorで子プロセスを作成する方法はありますか。または新しいターミナルウィンドウを生成します-見ることができず、グーグルは私に合理的な答えを与えませんでした。

私のコード

##
# Project Thor File
#
# @use thor list
##
class IanWarner < Thor

##
# Open Jekyll Server
#
# @use thor ian_warner:openServer
##
desc "openServer", "Start the Jekyll Server"
def openServer

    system("clear")
    say("\n\t")

    say("Start Server\n\t")
    system("jekyll --server 4000 --auto")

    say("Open Site\n\t")
    system("open http://localhost:4000")

    say("\n")

end

end
4

1 に答える 1

1

あなたは物事を台無しにしているようです。Thor一般に、強力なCLIラッパーです。CLI自体は一般的にシングルスレッドです。

2つのオプションがあります。異なる子孫を作成して異なるスレッド/プロセスとして実行するか、スレッド/プロセスが実行されるまで待機するようThorに強制するか(推奨)、またはハッキングします(最後にアンパサンドに注意してください)。openjekyll startsystem("jekyll --server 4000 --auto &")

後者は機能しますが、サーバーの起動を制御する必要があります(かなりの時間がかかる場合があります)。これを実現するための2番目の醜いハックは、以下に依存することsleepです。

say("Start Server\n\t")
system("jekyll --server 4000 --auto &")

say("Wait for Server\n\t")
system("sleep 3")

say("Open Site\n\t")
system("open http://localhost:4000")

Upd:何を生み出したいか想像するのは難しいです。スクリプトの終了後にjekyllサーバーを実行したままにしたい場合は、次のようにします。

  desc "openServer", "Start the Jekyll Server"
  def openServer
    system "clear"
    say "\n\t"

    say "Starting Server…\n\t"
    r, w = IO.pipe
    # Jekyll will print it’s running status to STDERR
    pid = Process.spawn("jekyll --server 4000 --auto", :err=>w) 
    w.close
    say "Spawned with pid=#{pid}"
    rr = ''
    while (rr += r.sysread(1024)) do
     break if rr.include?('WEBrick::HTTPServer#start')
    end 
    Process.detach(pid) # !!! Leave the jekyll running

    say "Open Site\n\t"
    system "open http://localhost:4000"
  end 

ページを開いた後にjekyllをシャットダウンする場合は、への呼び出しopenもその呼び出しを生成する必要がありますProcess.waitpid

于 2013-03-25T05:16:06.717 に答える