
リモート ワークステーションで実行されている Emacs (v21.2.1) のインスタンスが複数あり、そのうちの 1 つを で終了したいと考えていますssh
。ワークステーションに ssh で接続しているときに、各インスタンスの PID を取得することはできますpgrep emacs
が ( などを使用して)、それらのプロセスのどれが特定のファイルを開いているかを判断する方法がわかりません。
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
走っている場合グヌーサーブ(XEmacs サーバーの GNU Emacs ポート)、または GNU Emacs ≥23 で付属の emacsserver を実行している場合は、実行中の Emacs インスタンスで任意の Lisp コマンドを実行できます。
gnuclient -r /tmp/gsrvdir1234/gsrv -batch -eval '(buffer-list)'
emacsclient -r /tmp/emacs1234/server -e '(buffer-list)' # Emacs ≥23 only
そうでなければ、非常にハック的な 2 つの方法しか思いつきません。
- Emacsインスタンスのメモリからファイル名を検索します。Linuxでは、プロセスのマップされたメモリは
/proc/$pid/mem
ですが、 を通じて読み取り可能な、実際にマップされているページのみを読み取ることができます/proc/$pid/maps
。そのための既存のプログラムは知りません。 - 脆弱性を含むファイルを開くローカル変数宣言つまり、任意の Lisp コードの実行を許可するものです。Emacs 21 では、特に指定がない限り、ローカル変数は安全として扱われていたため、危険であると宣言されるべき変数が、そうでなかったことは確かです。ただし、私はその例を知りません。