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

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

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

Действительно ли я глуп в размышлении, что это даже возможно?

1
задан 17.12.2010, 01:05

2 ответа

Использовать 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
1
ответ дан 17.12.2019, 00:29

При выполнении 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

Иначе я могу только думать два высоко hackish пути.

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

Теги

Похожие вопросы