Em alguns casos, ao delegar trabalho a um processo externo, é útil definir um tempo limite no comando para impedir que o Emacs seja interrompido indefinidamente.
Infelizmente, o seguinte não funciona.
(with-timeout (1 nil)
(call-process "/usr/bin/bash" nil t nil "-c" "sleep 10"))
O mesmo vale para shell-command
.
Existe uma maneira de definir um tempo limite para esses processos síncronos?
Ou seja, quero que o processo seja finalizado automaticamente se não terminar dentro de um certo número de segundos. Isso é possível?
shell-command
process
Malabarba
fonte
fonte
with-timeout
, mas eu useikill-process
edelete-process
.call-process
acima está configurando a saída a ser impressa no buffer atual (eu obtenho o mesmo efeito se eu passar em um buffer de saída diferente). É isso que você quer dizer?call-process
fontes, mas agora estou começando a suspeitar que não há como matá-lo com o tempo limite.Respostas:
Enquanto
call-process
estiver em execução, o emacs processará eventos,with-timeout
não funcionará sem isso:Você ainda pode usar
with-timeout
com processos (semi) síncronos.Você realmente usará um processo assíncrono, mas aguardará de forma síncrona enquanto estiver em execução, o Emacs processará eventos quando você executar
sit-for
, que poderá ser executado por 0 segundos. Você pode usar o argumento timeout-forms dewith-timeout
para interromper o processo se ele ainda estiver em execução quando o tempo limite for acionado.fonte
(sit-for 0.2)
após owhile
loop, mas isso parece instável. Existe uma maneira de saber que a saída foi impressa no buffer?(sit-for 0)
emacs gasta muito tempo deixando o processo rodar e não escutando o suficiente para eventos e inserindo o texto no buffer. Quando mudo o meu para as(sit-for .05)
coisas funcionam melhor e todo o texto entra no meu buffer. Mesmo para um processo curto, 0,05 segundos não é uma sobrecarga preocupante.(sit-for 0.2)
para que meus testes locais passassem e, mesmo assim, depois que fiz as alterações, os testes travis falharam.Você pode conseguir isso apenas adicionando uma chamada de tempo limite do GNU ao seu comando shell, o que evita a necessidade de conhecer quaisquer detalhes sobre o comportamento do Emacs. Por exemplo, executando:
Retornará em 5 segundos, não em 10 (o tempo limite pressiona Ctrl-C para você).
fonte