Pular para o conteúdo

Processos

Executar comandos externos com segurança.

Segurança primeiro#

dataforge
adopt Arcane.Process as Proc

Proc.run("echo ola")                    # sem shell
Proc.run(["echo", "texto com espacos"]) # lista: mais seguro ainda
Proc.run("...", shell := yes)           # shell, conscientemente

O resultado#

run sempre devolve um ProcessResult, mesmo quando falha:

CampoContém
stdouta saída padrão
stderra saída de erro
exit_code0 = sucesso
okyes se o código foi 0
failedo oposto de ok
linesstdout já separado em linhas
dataforge
r := Proc.run("comando_inexistente")
given r.failed:
    out $"nao rolou: {r.stderr}"     # código 127

Um comando inexistente devolve 127 em vez de derrubar o programa. Falha de processo externo é um resultado esperado, não uma exceção.

Atalhos#

dataforge
Proc.capture("echo x")     # só o stdout, sem a quebra final
Proc.check("test -f x")    # só yes/no
Proc.exit_code("cmd")      # só o número
Proc.exists("git")         # o programa está instalado?

Entrada e encadeamento#

dataforge
Proc.run("cat", input_text := "vindo da entrada")

Proc.pipeline(["printf 'c\na\nb'", "sort"])

A cadeia para no primeiro que falhar — devolvendo o resultado daquele, não um sucesso enganoso.

Tempo limite#

dataforge
Proc.run("sleep 5", timeout := 1)     # ok = no, timed_out = yes

Sempre ponha timeout em comando que fala com a rede. Sem ele, um servidor que não responde trava seu programa indefinidamente.

Segundo plano#

dataforge
p := Proc.spawn("servidor --porta 8080")
Proc.is_running(p)
Proc.terminate(p)      # pede para encerrar (SIGTERM)
Proc.kill(p)           # força (SIGKILL)
r := Proc.wait(p)      # espera e colhe o resultado