En algunos casos, al delegar el trabajo a un proceso externo, es útil establecer un tiempo de espera en el comando para evitar que Emacs se cuelgue indefinidamente.
Desafortunadamente, lo siguiente no funciona.
(with-timeout (1 nil)
(call-process "/usr/bin/bash" nil t nil "-c" "sleep 10"))
Lo mismo vale para shell-command
.
¿Hay alguna manera de establecer un tiempo de espera en estos procesos sincrónicos?
Es decir, quiero que el proceso se elimine automáticamente si no termina en un cierto número de segundos. ¿Es eso posible?
shell-command
process
Malabarba
fuente
fuente
with-timeout
, pero he usadokill-process
ydelete-process
.call-process
anterior está configurando la salida para que se imprima en el búfer actual (obtengo el mismo efecto si paso un búfer de salida diferente). ¿Es eso lo que quieres decir?call-process
fuentes, pero ahora empiezo a sospechar que no hay forma de matarlo cuando se agota el tiempo.Respuestas:
Mientras se
call-process
está ejecutando, emacs procesará eventos,with-timeout
no funcionará sin esto:Todavía puede usar
with-timeout
con procesos (semi) sincrónicos.Realmente usará un proceso asincrónico pero esperará sincrónicamente mientras se está ejecutando, Emacs procesará los eventos cuando ejecute
sit-for
, que puede ejecutar durante 0 segundos. Luego puede usar el argumento timeout-forms dewith-timeout
para matar el proceso si todavía se está ejecutando cuando se activa el tiempo de espera.fuente
(sit-for 0.2)
después delwhile
ciclo, pero eso se siente inestable. ¿Hay alguna manera de saber que la salida se ha impreso en el búfer?(sit-for 0)
emacs pasa demasiado tiempo dejando que se ejecute el proceso y no escuchando suficientes eventos e insertando el texto en el búfer. Cuando cambio el mío a(sit-for .05)
cosas, las cosas funcionan mejor y todo el texto entra en mi búfer. Incluso para un proceso corto .05 segundos no es una sobrecarga preocupante.(sit-for 0.2)
para que pasaran mis pruebas locales, y aun así, una vez que presioné los cambios, las pruebas de travis fallaron.Puede lograr esto simplemente agregando una invocación de tiempo de espera de GNU a su comando de shell, lo que evita la necesidad de conocer cualquier detalle sobre el comportamiento de Emacs. Por ejemplo ejecutando:
Regresará en 5 segundos, no en 10 (el tiempo de espera efectivamente presiona Ctrl-C para usted).
fuente