
Auf einer Remote-Workstation laufen mehrere Instanzen von Emacs (v21.2.1), von denen ich eine per beenden möchte ssh
. Ich kann die PIDs jeder Instanz abrufen ( pgrep emacs
etwa mit ), während ich per SSH auf die Workstation zugreife, weiß aber nicht, wie ich feststellen kann, welcher dieser Prozesse eine bestimmte Datei geöffnet hat.
lsof
gibt keine offensichtlich nützlichen Informationen zurück, vermutlich weil Emacs die Dateien nicht geöffnet hält, während sie in einem Puffer bearbeitet werden. Vielleicht ist es möglich, die vorhandenen Emacs-Fenster an meinen aktuellen Standort zu exportieren, aber ich weiß nicht, wie ich das anstellen soll.
Bin ich dumm, wenn ich glaube, dass das überhaupt möglich ist?
Antwort1
Verwendenstrace
um zu sehen, welche Dateien geöffnet sind (es hält Dinge offen oder überprüft zumindest häufig die Dateien). Dies sollte Ihnen eine Liste von allem geben, was der Prozess überprüft. Natürlich müssen Sie es etwas analysieren und Duplikate herausfiltern (und die richtige PID ersetzen):
strace -p1337 -e trace=file
Es wird eine Ausgabe wie diese erzeugt:
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
Antwort2
Wenn Sie laufenGnuserv(ein GNU Emacs-Port des XEmacs-Servers), oder wenn Sie den enthaltenen Emacsserver auf GNU Emacs ≥23 ausgeführt haben, können Sie beliebige Lisp-Befehle in einer laufenden Instanz von Emacs ausführen.
gnuclient -r /tmp/gsrvdir1234/gsrv -batch -eval '(buffer-list)'
emacsclient -r /tmp/emacs1234/server -e '(buffer-list)' # Emacs ≥23 only
Ansonsten fallen mir nur zwei höchst hackige Möglichkeiten ein.
- Durchsuchen Sie den Speicher der Emacs-Instanz nach dem Dateinamen. Unter Linux befindet sich der zugeordnete Speicher des Prozesses in
/proc/$pid/mem
, aber man kann nur die Seiten lesen, die tatsächlich zugeordnet sind, also über lesbar sind/proc/$pid/maps
. Mir ist kein Programm dafür bekannt. - Öffnen Sie eine Datei mit einer anfälligenDeklaration lokaler Variablen, also eine, die die Ausführung beliebigen Lisp-Codes erlaubt. Emacs 21 behandelte lokale Variablen immer noch als sicher, sofern nicht anders angegeben, also gab es sicherlich Variablen, die als riskant hätten deklariert werden sollen, es aber nicht waren. Ich kenne allerdings kein Beispiel.