
Tengo varias instancias de Emacs (v21.2.1) ejecutándose en una estación de trabajo remota, una de las cuales me gustaría eliminar mediante ssh
. Puedo obtener los PID de cada instancia (usando pgrep emacs
, por ejemplo) mientras estoy conectado a la estación de trabajo, pero no sé cómo determinar cuál de esos procesos tiene un archivo en particular abierto.
lsof
no devuelve ninguna información que sea obviamente útil, presumiblemente porque Emacs no mantiene los archivos abiertos mientras se editan en un búfer. Tal vez sea posible exportar las ventanas de Emacs existentes a mi ubicación actual, pero no sé cómo haría eso.
¿Soy tonto al pensar que esto es posible?
Respuesta1
Usarstrace
para ver qué archivos tiene abiertos (mantiene las cosas abiertas, o al menos revisa los archivos con frecuencia). Esto debería brindarle una lista de todo lo que analiza el proceso; obviamente, tendrá que analizarlo un poco y filtrar los duplicados (y sustituir el pid adecuado):
strace -p1337 -e trace=file
Genera una salida como esta:
unlink("/tmp/emacsBYJwbf") = 0
stat("/home/tjackson/.jabber-avatars", {st_mode=S_IFDIR|0755, st_size=16384, ...}) = 0
stat("/home/tjackson/.jabber-avatars/e7e63a04ac20783855bc31ab8fcfb7bc23a39036.jpg", {st_mode=S_IFREG|0644, st_size=2556, ...}) = 0
stat("/lab_scratch/mymachine/work/path/to/some/file.cxx", {st_mode=S_IFREG|0644, st_size=45772, ...}) = 0
open("/lab_scratch/mymachine/work/path/to/some/file.cxx", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/path/to/some/file.cxx", {st_mode=S_IFREG|0644, st_size=45772, ...}) = 0
stat("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", {st_mode=S_IFREG|0644, st_size=92260, ...}) = 0
open("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", {st_mode=S_IFREG|0644, st_size=92260, ...}) = 0
stat("/home/tjackson/News/drafts/drafts/272", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/scratch2/complex/tmp/output.log", {st_mode=S_IFREG|0644, st_size=378306, ...}) = 0
open("/scratch2/complex/tmp/output.log", O_RDONLY) = 10
stat("/scratch2/complex/tmp/output.log", {st_mode=S_IFREG|0644, st_size=378306, ...}) = 0
stat("/home/tjackson/.diary", {st_mode=S_IFREG|0644, st_size=72457, ...}) = 0
open("/home/tjackson/.diary", O_RDONLY) = 10
stat("/home/tjackson/.diary", {st_mode=S_IFREG|0644, st_size=72457, ...}) = 0
stat("/home/tjackson/News/drafts/drafts/271", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/home/tjackson/News/drafts/drafts/273", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/home/tjackson/personal/.newsrc-dribble", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/lab_scratch/mymachine/work/sandbox/TAGS", {st_mode=S_IFREG|0644, st_size=2578671, ...}) = 0
open("/lab_scratch/mymachine/work/sandbox/TAGS", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/sandbox/TAGS", {st_mode=S_IFREG|0644, st_size=2578671, ...}) = 0
Respuesta2
si estas corriendoGnuserv(un puerto GNU Emacs del servidor XEmacs), o si estaba ejecutando el servidor emacs incluido en GNU Emacs ≥23, puede ejecutar comandos Lisp arbitrarios en una instancia en ejecución de Emacs.
gnuclient -r /tmp/gsrvdir1234/gsrv -batch -eval '(buffer-list)'
emacsclient -r /tmp/emacs1234/server -e '(buffer-list)' # Emacs ≥23 only
De lo contrario, sólo se me ocurren dos formas muy hackers.
- Busque en la memoria de la instancia de Emacs el nombre del archivo. En Linux, la memoria asignada del proceso está en
/proc/$pid/mem
, pero solo puedes leer las páginas que realmente están asignadas, tal como se pueden leer a través de/proc/$pid/maps
. No conozco ningún programa existente para eso. - Abrir un archivo que contenga una vulnerabilidaddeclaración de variables locales, es decir, uno que permite la ejecución de código Lisp arbitrario. Emacs 21 todavía trataba las variables locales como seguras a menos que se indicara lo contrario, por lo que seguramente había variables que deberían haber sido declaradas como riesgosas pero no lo fueron. Aunque no conozco ningún ejemplo.