Как я могу отправить сигнал Cg /quit в emacs из emacsclient, когда сервер занят?
В моей текущей настройке я запускаю emacs --daemon
при загрузке и последующем использовании emacsclient
делать работу. Тем не менее, я заметил проблему с этим. Когда происходит сложная часть обработки, Cg перестает работать: сложная работа не может быть остановлена или прекращена досрочно. Насколько я могу судить, это связано с тем, что клиент emacs должен ждать подтверждения от сервера перед обработкой любого ввода от клиента. В результате Cg не будет работать, когда мне это больше всего нужно - спасать процессы, которые отнимают много времени или могут быть разрушительными.
Есть ли какие-либо обходные пути к этому или способ заставить серверный процесс "остановить это!"? Ничто в разделах руководства " Выход из системы" или " Аварийный выход", похоже, не признает, что эта проблема существует, поэтому возможно, что это результат того, что я сделал что-то не так. Если так, что я делаю не так?
Если ответ "нет, нет способа сделать то, что вы хотите; emacsclient
процессы не могут справиться с блокировкой сервера в течение нетривиального промежутка времени ", я отмечу как принятый ответ, который указывает в коде или документации, где этот ответ может быть получен: я не смог найти такой вещь.:(
2 ответа
Пока что единственный способ, который я нашел, - это отправить SIGUSR2
сигнал занятому процессу Emacs с помощью командной строки kill
- независимо от того, работает ли он как сервер (с --daemon
) или нет. Это не приведет к принудительному завершению процесса emacs, в то время как он может прерывать то, что он делает. Давайте попробуем пример, чтобы сломать sleep-for
цикл работает на сервере Emacs. (Да, sleep-for
может быть сломан C-g
но это всего лишь пример. Это работало в некоторых случаях, когда emacs не отвечает на команды клавиатуры.)
Сначала запустите сервер Emacs, затем используйте emacsclient
подключитесь к нему, введите M-: (sleep-for 120)
, Теперь перейдите в другой терминал и найдите идентификатор процесса сервера с помощью командной строки: ps x|grep 'emacs.*--daemon'
, Предполагая, что PID, который мы нашли здесь, 12345. Теперь используйте терминал, чтобы сломать его:
kill -USR2 12345
Теперь мы должны увидеть sleep-for
цикл прерван. В некоторых случаях мне нужно отправить этот сигнал несколько раз.
Также обратите внимание, что SIGUSR1
не работает так SIGUSR2
рекомендуется, и это может работать только на версиях Emacs, которые больше v24. Надеюсь это поможет!
К сожалению, я не думаю, что есть элегантное решение. Одна из возможностей - создать запасной сеанс emacsclient, спрятанный в сеансе tmux/screen, который вы можете восстановить, а затем вставить туда Cg. Но это отчасти грубо.