Тор Запустите Jekyll, затем откройте страницу в браузере
Привет, я хочу, чтобы Тор запустил сервер - Jekyll / Python / PHP и т. Д., Затем открыл браузер
Однако запуск является блокирующей задачей.
Есть ли способ создать дочерний процесс в Thor; или создать новое окно терминала - не смог увидеть, и Google не дал мне разумных ответов.
Мой код
##
# 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
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
для этого.