Могу ли я узнать, какие файлы открыты в экземпляре Emacs, запущенном на удаленной рабочей станции?

Могу ли я узнать, какие файлы открыты в экземпляре Emacs, запущенном на удаленной рабочей станции?

У меня есть несколько экземпляров Emacs (v21.2.1), запущенных на удаленной рабочей станции, один из которых я хотел бы завершить через ssh. Я могу получить PID каждого экземпляра (используя pgrep emacs, например), когда подключаюсь по ssh к рабочей станции, но я не знаю, как определить, какой из этих процессов открыл определенный файл.

lsofне возвращает никакой очевидно полезной информации, вероятно, потому, что Emacs не держит файлы открытыми, пока они редактируются в буфере. Возможно, можно экспортировать существующие окна Emacs в мое текущее местоположение, но я не знаю, как это сделать.

Неужели я глуп, думая, что это вообще возможно?

решение1

Использоватьstraceчтобы увидеть, какие файлы он открыл (он действительно держит их открытыми или, по крайней мере, часто проверяет файлы). Это должно дать вам список всего, что просматривает процесс, очевидно, вам придется немного его проанализировать и отфильтровать дубликаты (и подставить правильный pid):

strace -p1337 -e trace=file

Он генерирует вывод следующим образом:

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

решение2

Если вы бежитеGnuserv(порт GNU Emacs сервера XEmacs) или если вы используете включенный emacsserver в GNU Emacs ≥23, вы можете запускать произвольные команды Lisp в работающем экземпляре Emacs.

gnuclient -r /tmp/gsrvdir1234/gsrv -batch -eval '(buffer-list)'
emacsclient -r /tmp/emacs1234/server -e '(buffer-list)'  # Emacs ≥23 only

В противном случае я могу придумать только два крайне хакерских способа.

  • Поиск в памяти экземпляра Emacs для имени файла. В Linux отображенная память процесса находится в/proc/$pid/mem, но вы можете читать только те страницы, которые фактически отображены, как читаемые через /proc/$pid/maps. Я не знаю существующей программы для этого.
  • Откройте файл, содержащий уязвимостьобъявление локальной переменной, т. е. тот, который позволяет выполнять произвольный код Lisp. Emacs 21 по-прежнему считал локальные переменные безопасными, если не указано иное, так что наверняка были переменные, которые следовало бы объявить рискованными, но не объявили. Хотя я не знаю ни одного примера.

Связанный контент