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, conscientementeO resultado#
run sempre devolve um ProcessResult, mesmo quando falha:
| Campo | Contém |
|---|---|
stdout | a saída padrão |
stderr | a saída de erro |
exit_code | 0 = sucesso |
ok | yes se o código foi 0 |
failed | o oposto de ok |
lines | stdout já separado em linhas |
dataforge
r := Proc.run("comando_inexistente")
given r.failed:
out $"nao rolou: {r.stderr}" # código 127Um 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 = yesSempre 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