У меня есть несколько экземпляров Emacs (v21.2.1), работающего на удаленной рабочей станции, один из которых я хотел бы уничтожить через ssh
. Я могу получить PIDs каждого экземпляра (использование pgrep emacs
, скажите), в то время как ssh'd в рабочую станцию, но я не знаю, как определить, какой из тех процессов имеет конкретный открытый файл.
lsof
не возвращает информации, это очевидно полезно, по-видимому, потому что Emacs не сохраняет файлы открытыми, в то время как они редактируются в буфере. Возможно, возможно экспортировать существующие окна Emacs в мое текущее местоположение, но я не знаю, как я пошел бы об этом.
Действительно ли я глуп в размышлении, что это даже возможно?
Использовать 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
При выполнении 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 пути.
/proc/$pid/mem
, но можно только прочитать страницы, которые на самом деле отображаются, как читаемые через /proc/$pid/maps
. Я не знаю о существующей программе для этого.