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 本身通常是单线程的。

您有两个选择:要么创建不同的Thor后代并将它们作为不同的线程/进程运行,强制open线程/进程等待直到jekyll start正在运行(首选)或破解system("jekyll --server 4000 --auto &")(注意末尾的 & 符号。)

后者会起作用,但你仍然要控制服务器的启动(这可能需要很长时间。)实现这一点的第二个丑陋的黑客是依靠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 回答