নিম্নলিখিত দ্রুত এবং নোংরা অজগর স্ক্রিপ্ট stdout একটি প্রক্রিয়া স্মৃতি ডাম্প। এটি কোনও অদলবদল পৃষ্ঠা বা ম্যাপ করা ফাইল লোড করার পার্শ্ব প্রতিক্রিয়া রয়েছে। 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
(বর্তমানে স্বীকৃত উত্তর হিসাবে বোঝা যাচ্ছে) ব্যবহার করে পুরো সিস্টেমটিকে আনপ্প করার পরিবর্তে , আপনি আপনার ডিসপ্লে ম্যানেজার এবং তার সমস্ত শিশুদের প্রক্রিয়া স্মৃতিগুলি (যা স্বেচ্ছাসেবী চাপানোর জন্য) ডাম্প করে আনটপআপ করতে চাইতে পারেন। আরও দেখুন "কিভাবে swap- র জন্য একটি অদলবদল-আউট zsh প্রক্রিয়া বলপূর্বক?" Stackoverflow উপর।