In einigen Fällen ist es beim Delegieren von Arbeit an einen externen Prozess hilfreich, eine Zeitüberschreitung für den Befehl festzulegen, um zu verhindern, dass Emacs auf unbestimmte Zeit hängen bleibt.
Leider funktioniert das Folgende nicht.
(with-timeout (1 nil)
(call-process "/usr/bin/bash" nil t nil "-c" "sleep 10"))
Das gilt auch für shell-command
.
Gibt es eine Möglichkeit, ein Timeout für diese synchronen Prozesse festzulegen?
Das heißt, ich möchte, dass der Prozess automatisch abgebrochen wird, wenn er nicht innerhalb einer bestimmten Anzahl von Sekunden abgeschlossen ist. Ist das möglich?
shell-command
process
Malabarba
quelle
quelle
with-timeout
, aber ich habekill-process
und benutztdelete-process
.call-process
Oben wird festgelegt, dass die Ausgabe auf dem aktuellen Puffer gedruckt werden soll (ich erhalte den gleichen Effekt, wenn ich einen anderen Ausgabepuffer übergebe). Meinst Du das?call-process
Quellen schauen , aber jetzt beginne ich zu vermuten, dass es keine Möglichkeit gibt, es bei einer Auszeit zu töten.Antworten:
Während der
call-process
Ausführung verarbeitet Emacs Ereignisse undwith-timeout
funktioniert ohne diese Funktion nicht:Sie können weiterhin
with-timeout
mit (halb) synchronen Prozessen arbeiten.Sie verwenden tatsächlich einen asynchronen Prozess, warten jedoch synchron, während er ausgeführt wird. Emacs verarbeitet beim Ausführen Ereignisse
sit-for
, die Sie 0 Sekunden lang ausführen können. Sie können dann das Argument timeout-forms von verwendenwith-timeout
, um den Prozess abzubrechen, wenn er beim Auslösen des Timeouts noch ausgeführt wird.quelle
(sit-for 0.2)
nach derwhile
Schleife einen anderen anrufe, aber das fühlt sich instabil an. Gibt es eine Möglichkeit zu wissen, dass die Ausgabe auf dem Puffer gedruckt wurde?(sit-for 0)
, dass emacs zu viel Zeit damit verbringt, den Prozess laufen zu lassen und nicht genug auf Ereignisse zu warten und den Text in den Puffer einzufügen. Wenn ich meine auf(sit-for .05)
Dinge ändere, funktionieren die Dinge besser und der gesamte Text gelangt in meinen Puffer. Selbst für einen kurzen Prozess sind 0,05 Sekunden kein besorgniserregender Overhead.(sit-for 0.2)
meine lokalen Tests zum Bestehen verwenden musste, und selbst dann, wenn ich die Änderungen vorgenommen habe, sind die Travis-Tests fehlgeschlagen.Sie können dies erreichen, indem Sie Ihrem Shell-Befehl lediglich einen GNU-Timeout- Aufruf hinzufügen , der die Notwendigkeit umgeht, Details zum Emacs-Verhalten zu kennen. Zum Beispiel laufen:
Wird in 5 Sekunden zurückkehren, nicht in 10 (Timeout drückt effektiv Strg-C für Sie).
quelle