您好我希望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
答案 0 :(得分: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")
更新:很难想象你想要收获什么。如果您想在脚本完成后让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
。