निम्नलिखित त्वरित और गंदे अजगर स्क्रिप्ट एक प्रक्रिया की स्मृति को रोक देती है। यह किसी भी स्वैप किए गए पृष्ठ या मैप की गई फ़ाइल को लोड करने का दुष्प्रभाव है। इसे उस तरह से कॉल करें cat_proc_mem 123 456 789
जहां तर्क प्रक्रिया आईडी हैं।
यह स्क्रिप्ट पूरी तरह से लिनक्स के लिए विशिष्ट है। यह एक समान /proc
संरचना (सोलारिस?) के साथ अन्य प्रणालियों के लिए अनुकूल हो सकता है , लेकिन इसे * बीएसडी पर चलाने के बारे में भूल जाएं। यहां तक कि लिनक्स पर, आप की परिभाषा को बदलने की आवश्यकता हो सकती है c_pid_t
और के मूल्यों PTRACE_ATTACH
और PTRACE_DETACH
। यह एक प्रूफ-ऑफ-थ्योरी स्क्रिप्ट है, जिसका अर्थ अच्छी प्रोग्रामिंग प्रथाओं के उदाहरण के रूप में नहीं है। अपने जोखिम पार इस्तेमाल करें।
लिनक्स एक प्रक्रिया की स्मृति को उपलब्ध कराता है /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
}
swapon
/ /swapoff
(वर्तमान में स्वीकृत जवाब के रूप में सुझाव देता है), आप अपने डिस्प्ले मैनेजर और उसके सभी बच्चों को उनकी प्रक्रिया की यादों (जो अनसैप्सिंग को मजबूर करते हैं) को डंप करने से अनसैप करना चाह सकते हैं। यह भी देखें "कैसे में स्वैप करने के लिए एक बदली-आउट zsh प्रक्रिया के लिए मजबूर करने?" Stackoverflow पर।