Тор Запустите 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 для этого.

Другие вопросы по тегам