답변:
사용 가능한 RAM이 충분한 경우이 시퀀스를 루트로 사용할 수 있습니다.
$ swapoff -a
$ swapon -a
(모든 응용 프로그램의 명시 적 스왑 인을 강제하기 위해)
(리눅스를 사용한다고 가정)
다음의 더 빠르고 더러운 파이썬 스크립트는 프로세스의 메모리를 stdout에 덤프합니다. 스왑 아웃 페이지 또는 매핑 된 파일을로드하면 부작용이 발생합니다. cat_proc_mem 123 456 789
인수가 프로세스 ID 인 것처럼 호출하십시오 .
이 스크립트는 Linux에만 해당됩니다. 유사한 /proc
구조 (Solaris?)를 가진 다른 시스템에도 적용 할 수 있지만 * BSD 등에서 실행하는 것을 잊어 버리십시오. 심지어 리눅스에, 당신의 정의를 변경해야 할 수도 있습니다 c_pid_t
및의 값 PTRACE_ATTACH
과 PTRACE_DETACH
. 이것은 원리 증명 스크립트이며, 좋은 프로그래밍 관행의 예가 아닙니다. 자신의 책임하에 사용하십시오.
Linux는 프로세스 메모리를로 사용할 수있게합니다 /proc/$pid/mem
. 특정 주소 범위 만 읽을 수 있습니다. 이 범위는 텍스트 파일에서 메모리 매핑 정보를 읽어서 찾을 수 있습니다 /proc/$pid/maps
. 의사 파일 /proc/$pid/mem
은 읽기 권한이있는 모든 프로세스에서 읽을 수 없습니다. 리더 프로세스는을 호출해야합니다 ptrace(PTRACE_ATTACH, $pid)
.
#!/usr/bin/env python
import ctypes, re, sys
## Partial interface to ptrace(2), only for PTRACE_ATTACH and PTRACE_DETACH.
c_ptrace = ctypes.CDLL("libc.so.6").ptrace
c_pid_t = ctypes.c_int32 # This assumes pid_t is int32_t
c_ptrace.argtypes = [ctypes.c_int, c_pid_t, ctypes.c_void_p, ctypes.c_void_p]
def ptrace(attach, pid):
op = ctypes.c_int(16 if attach else 17) #PTRACE_ATTACH or PTRACE_DETACH
c_pid = c_pid_t(pid)
null = ctypes.c_void_p()
err = c_ptrace(op, c_pid, null, null)
if err != 0: raise SysError, 'ptrace', err
## Parse a line in /proc/$pid/maps. Return the boundaries of the chunk
## the read permission character.
def maps_line_range(line):
m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
return [int(m.group(1), 16), int(m.group(2), 16), m.group(3)]
## Dump the readable chunks of memory mapped by a process
def cat_proc_mem(pid):
## Apparently we need to ptrace(PTRACE_ATTACH, $pid) to read /proc/$pid/mem
ptrace(True, int(pid))
## Read the memory maps to see what address ranges are readable
maps_file = open("/proc/" + pid + "/maps", 'r')
ranges = map(maps_line_range, maps_file.readlines())
maps_file.close()
## Read the readable mapped ranges
mem_file = open("/proc/" + pid + "/mem", 'r', 0)
for r in ranges:
if r[2] == 'r':
mem_file.seek(r[0])
chunk = mem_file.read(r[1] - r[0])
print chunk,
mem_file.close()
## Cleanup
ptrace(False, int(pid))
if __name__ == "__main__":
for pid in sys.argv[1:]:
cat_proc_mem(pid)
참조 에 대한 자세한 정보를/proc/$pid/mem
.
unswap () {
cat_proc_mem "$@" >/dev/null
}
kill -CONT 1234
1234는 PID 임)를 보내서 다시 시작하십시오.
완벽을 기하기 위해 GDB는 프로세스 이미지를 덤프 할 수 있습니다. 전체 프로세스 메모리를 읽을 수있는 다른 방법이 없습니다 --- 나는 그것을 unswaps 확인하지 못했지만, 그것은에있다 :
gdb -p $mypid
다음에
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core
gcore $pid
는 작은 래퍼 스크립트로 gdb 외부에서도 사용 가능
gdb --batch -p $pid -ex "gcore /dev/null" 2>/dev/null
swapon / swapoff는 스왑 공간을 완전히 비우지 만 / proc 파일 시스템을 통해서도 스왑 공간을 확보 할 수 있습니다. 첫 번째를 원합니다.
# To free pagecache
echo 1 > /proc/sys/vm/drop_caches
# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches
# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches
sysctl vm.drop_caches=X
. 또한 sysctl은 sudo하기가 더 쉽습니다.
swapon
/를 사용하여 전체 시스템을 스왑 해제하는 대신swapoff
(현재 허용되는 답변에서 알 수 있듯이) 프로세스 메모리를 스왑 (해제 스왑 해제)하여 디스플레이 관리자와 모든 자식을 스왑 해제 할 수 있습니다. stackoverflow 에서“스왑 아웃 zsh 프로세스를 강제로 스왑 인하는 방법?” 도 참조하십시오 .