start-up – Manejar archivos de bloqueo de escritorio obsoletos después de un bloqueo de emacs / system

Pregunta:

Si Emacs o el sistema falla cuando el desktop-save-mode está activo, Emacs deja un archivo de bloqueo de escritorio obsoleto. La próxima vez que se cargue el escritorio (desde otro ID de proceso de Emacs), la carga se interrumpe con una pregunta:

Advertencia: el archivo de escritorio parece estar siendo utilizado por PID xxx.
Su uso puede causar conflictos. ¿Usarlo de todos modos? (sí o n)

incluso si el proceso con PID xxx (sustituya un ID de proceso por xxx) ya no está activo.

Aquí hay un ejemplo mínimo: Primero ejecute emacs -Q -l init.el con el siguiente archivo de inicio ( init.el ):

(require 'desktop)
(let ((dir "/home/hakon/my-emacs-desktop-test"))
  (setq desktop-path (list dir))
  (desktop-save-mode 1))

Luego abra algunos búferes nuevos y salga de emacs. Esto generará un nuevo archivo de escritorio. Ahora, cree un archivo de bloqueo falso (con el ID de proceso 999 o sustituya cualquier número entero que no represente un ID de proceso en ejecución)

echo "999" > /home/hakon/my-emacs-desktop-test/.emacs.desktop.lock

y vuelva a ejecutar Emacs con un nuevo archivo de inicio emacs -Q -l init2.el , donde init2.el es:

(require 'desktop)
(let ((dir "/home/hakon/my-emacs-desktop-test"))
  (setq desktop-path (list dir))
  (desktop-save-mode 1))
(desktop-read)

Esto debería mostrar la advertencia ( "el archivo de escritorio parece estar en uso" ).

¿Cómo podemos deshacernos de este mensaje?

Respuesta:

Puede verificar si el proceso aún está activo usando el comando del sistema ps -p $PID , luego borre el archivo de bloqueo si el proceso aún no está activo. La siguiente modificación de init2.el anterior muestra cómo se puede hacer esto desde dentro de Emacs. Tenga en cuenta que utilizo dos funciones privadas de desktop.el , a saber desktop-owner desktop-full-lock-name y desktop-full-lock-name .

(require 'desktop)
(defun my-remove-stale-lock-file (dir)
  (let ((pid (desktop-owner dir)))
    (when pid
      (let ((infile nil)
            (destination nil)
            (display nil))
        (unless (= (call-process "ps" infile destination display "-p"
                                 (number-to-string pid)) 0)
          (let ((lock-fn (desktop-full-lock-name dir)))
            (delete-file lock-fn)))))))

(let ((dir "/home/hakon/my-emacs-desktop-test"))
  (my-remove-stale-lock-file dir)
  (setq desktop-path (list dir))
  (desktop-save-mode 1))
(desktop-read)

Ahora, con este enfoque, el archivo de bloqueo no debería existir en el momento en que se llama a la desktop-read y ya no se emite la advertencia.

Nota :

También hay un desktop-load-locked-desktop variable en desktop.el . Establecer esta variable en t cargará un escritorio incluso si el archivo de bloqueo existe (y evitará la advertencia). Pero por lo que puedo ver, esto no comprueba si el proceso está vivo o no. Por lo tanto, puede que no sea una buena idea en el caso de que haya un proceso Emacs vivo usando el mismo escritorio.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım