Как я могу отсоединить процесс от Elixir System.cmd / 2 до завершения команды? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь запустить это (script.exs):

System.cmd("zsh", ["-c" "com.spotify.Client"])
IO.puts("done.")

Spotify открывается, но "готово". никогда не появляется на экране. Я также попытался:

System.cmd("zsh", ["-c" "nohup com.spotify.Client &"])
IO.puts("done.")

Мой сценарий останавливается только когда я закрываю окно spotify. Можно ли запускать команды, не дожидаясь его окончания?

1 Ответ

2 голосов
/ 03 апреля 2020

Не следует создавать системные задачи в слепой надежде, что они будут работать правильно. Если происходит сбой системной задачи, в вызывающем процессе OTP должны быть предприняты некоторые действия, иначе рано или поздно произойдет sh в процессе работы, и никто не узнает, что произошло и почему.

Существует много возможных Scenar ios, я бы go с Task.start_link/1 (при условии, что прерывания вызывающего процесса завершаются) или с Task.async/1, сопровождаемым явным Task.await/1 где-то в дереве наблюдения.

Если, несмотря на все вышеописанное, вас не волнует надежность, используйте Kernel.spawn/1, как показано ниже

pid = spawn(System, :cmd, ~w|zsh -c com.spotify.Client|)
# Process.monitor(pid) # yet give it a chance to handle errors
IO.puts("done.")
...