터미널에 접근할 수 없어서 더 이상 접근할 수 없는 Emacs 스크래치 버퍼의 내용을 저장하려고 합니다.
내 Linux 컴퓨터에서는 SSH를 통해 서버에 연결하고 Emacs를 시작했습니다. 내 Linux 상자는 이제 정지되었지만 SSH를 통해 서버에서 활성화된 Emacs 프로세스를 계속 볼 수 있습니다.
Emacs가 직접 액세스하지 않고 임시 콘텐츠를 덤프/저장하도록 하는 방법이 있습니까? 나는 두 가지 아이디어를 가지고 있습니다 :
- Emacs가 코어를 덤프한 다음 코어를 다시 로드하도록 프로세스에 신호를 보냅니다(그런 다음 스테이징을 저장합니다).
- 프로세스의 표준 입력에 키 입력을 보내 Emacs 프로세스에 파일을 저장하도록 지시합니다(예: via )
echo "abd" > /proc/<pid>/fd/0
. 두 개의 터미널을 열어서 시도했는데 대상 터미널에 키 입력이 표시되었지만 Emacs가 이를 포착하지 못했습니다.
답변1
실행 중인 프로세스에 gdb를 연결하는 행운이 있었습니다. 다음에서 많은 양의 차입이 발생했습니다.분리된 프로세스에 터미널을 연결하는 방법은 무엇입니까?
파일 쓰기
mkfifo /tmp/some_name
gdb -p [pid]
- (gdb 내에서):
call close(0)
- (gdb 내부):
call open('/tmp/some_name', 0600)
.이때 gdb가 정지됩니다. - (쉘에서):
echo '(write-file "savedresults")' > /tmp/some_name
- (GBD 내):
ctrl-d
스크랩의 내용은 "savedresults" 파일에 기록됩니다. 흥미로운 점은 (write-file "savedresults")
파일에 추가하는 것입니다(이유는 확실하지 않음).
Cx CW 이름
mkfifo /tmp/some_name
gdb -p [pid]
- (gdb 내에서):
call close(0)
- (gdb 내부):
call open('/tmp/some_name', 0600)
.이때 gdb가 정지됩니다. - (셸에서): (
cmd="^X^Wsavedresults"
키 시퀀스를 통해 ^X 입력: CTRL-V CTRL-X, ^W"와 유사 - (쉘에서):
echo "$cmd" > /tmp/some_name
- (GBD 내):
ctrl-d
내용은 "savedresults" 파일에 기록됩니다.
답변2
이맥스 서버
가장 좋은 방법은 연락하는 것입니다.이맥스 서버Emacs Lisp 명령을 실행하세요.
emacsclient -e '(with-current-buffer "*scratch*" (write-file "~/scratch.txt"))'
또는 Emacs를 현재 터미널에 연결하고 `로 전환하는 등 원하는 작업을 수행할 수 있습니다.긁힌 자국내용을 버퍼링하고 저장합니다.
emacsclient -nw
안타깝게도 서버를 명시적으로 시작해야 합니다. 매우 유용하므로 이를 초기화 파일에 추가하는 것이 좋습니다 (server-start)
. 하지만 아직 수행하지 않았다면 지금 당장은 도움이 되지 않습니다.
Emacs 터미널로 입력 보내기
이것을 실행하면 echo "abd" > /proc/$emacs_pid/fd/0
Emacs가 실행 중인 터미널로 텍스트가 전송됩니다. 터미널에 데이터를 쓰면 데이터가 표시됩니다. 입력을 보낼 수 없습니다도착하다터미널: 입력한 내용이 표시됩니다.~에서터미널.
화면
당신이에 있다면화면또는멀티플렉서세션을 사용하면 기존 세션에 연결하고 프로그램과 계속 상호 작용할 수 있습니다. screen 및 tmux는 프로그래밍 방식으로 내부에서 실행되는 프로그램에 입력을 보내는 것도 지원합니다. 하지만 먼저 프로그램을 실행해야 하므로 이번에는 도움이 되지 않습니다.
Emacs의 경우 Screen은 emacsclient
.
코어 덤프
코어 덤프 필터링은 옵션입니다. Emacs는 버퍼의 내용을 단일 블록에 저장하며 그 사이에 공백이 있습니다. 공백에는 임의의 쓰레기가 포함될 수 있습니다. 마지막 작업이 삭제인 경우 삭제된 내용입니다.
기본적으로 SIGQUIT 신호는 프로세스를 종료하고 코어 덤프를 남깁니다(활성화된 경우). 그러나 Emacs는 SIGQUIT를 트랩합니다(최상위 수준으로 나가므로 어떤 경우에는 편리하지만 도움이 되지 않습니다). 그래서 당신은 필요디버거를 사용하여 연결하고 코어를 덤프하도록 만듭니다.. 어쨌든 이는 SIGQUIT에 비해 장점이 있습니다. 즉, 코어 덤프가 비활성화된 경우에도 프로세스를 계속 실행하고 작동합니다.
$ gdb -p $(pidof emacs)
(gdb) gcore
그럼 넌 할 수 있어코어 덤프 필터링데이터 추출
Emacs를 새 터미널에 다시 연결
Unix와 심지어 Linux에도 한 터미널에서 프로그램을 분리하고 다른 터미널에 연결하는 기능이 없습니다. 그러나 모든 프로그램에 디버거를 연결하고 다른 터미널을 열도록 하는 것은 가능합니다. 이는 우연일 수 있습니다. 작동할 때도 있고 프로그램이 충돌할 때도 있습니다. 이를 가능하게 하는 여러 가지 도구가 있습니다.실행 중인 프로세스를 거부하고 이를 새 화면 셸에 연결하는 방법은 무엇입니까?