GNU/Linux >> Znalost Linux >  >> Linux

Jak znovu načíst všechny spuštěné aplikace z odkládacího prostoru do RAM?

Následující rychlý a špinavý python skript vypíše paměť procesu do stdout. To má vedlejší účinek načítání jakékoli odložené stránky nebo mapovaného souboru. Nazvěte to jako cat_proc_mem 123 456 789 kde argumenty jsou ID procesů.

Tento skript je zcela specifický pro Linux. Může být adaptabilní na jiné systémy s podobným /proc struktura (Solaris?), ale zapomeňte na to, že byste jej provozovali např. *BSD. Dokonce i na Linuxu může být nutné změnit definici c_pid_t a hodnoty PTRACE_ATTACH a PTRACE_DETACH . Toto je skript pro ověření principu, který není míněn jako příklad správných programovacích postupů. Používejte na vlastní nebezpečí.

Linux zpřístupňuje paměť procesu jako /proc/$pid/mem . Čitelné jsou pouze určité rozsahy adres. Tyto rozsahy lze nalézt načtením informací o mapování paměti z textového souboru /proc/$pid/maps . Pseudosoubor /proc/$pid/mem nemůže být čteno všemi procesy, které mají oprávnění jej číst:proces čtečky musel zavolat 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)

Viz také další informace o /proc/$pid/mem .

unswap () {
  cat_proc_mem "[email protected]" >/dev/null
}

Pokud máte opravdu dostatek paměti RAM, můžete použít tuto sekvenci (jako root):

$ swapoff -a
$ swapon -a

(pro vynucení explicitní výměny všech vašich aplikací)

(za předpokladu, že používáte linux)


Jen pro úplnost, GDB umí výpis procesu image. Nezkontroloval jsem, že to odloží, ale musí --- neexistuje žádný jiný způsob, jak přečíst paměť celého procesu:
gdb -p $mypid
následován
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core


Linux
  1. Úvod do odkládacího prostoru na systémech Linux

  2. Jak přidat odkládací prostor na Ubuntu 22.04

  3. Jak přidat odkládací prostor v linuxu

  1. Jak vytvořit nebo zvětšit swapový prostor v Linuxu

  2. Jak přidat odkládací prostor na Debianu 11

  3. Jak zvětšit odkládací prostor v Linuxu

  1. Jak vložit do nano ze schránky?

  2. Jak přidělit více místa pro výměnu a zvětšit jeho velikost větší než Ram?

  3. Jak velký by měl být swapovací oddíl?