= /proc/PID =

<<TableOfContents()>>

'''Hinweis:''' Alle Einträge mit Ausnahme von {{{mem}}} sind nur lesbar.

== Anzeige ==
Bei einigen Einträgen, wie zum Beispiel {{{/proc/pid/environ}}} oder {{{/proc/pid/cmdline}}}, sind die einzelnen Werte durch 0-Bytes von einander getrennt.

Unter Linux kann man sich diese Werte mit einem der beiden Kommandos anzeigen lassen:
{{{
# cat /proc/pid/cmdline | tr "\000" "\n"
}}}
{{{
# strings -n 1 /proc/pid/cmdline
}}}

== /proc/pid/auxv ==
Auxiliary Vector des Programms. Der Auxiliary Vector dient der Kommunikation von Informationen vom Kernel in den User Space. Dabei werden Werte wie die UID und die effektive UID bereitgestellt. Die Werte sind als Schlüssel-Wert-Paar verfügbar.

Die Bedeutung der Werte ist in getauxval(3) beschrieben.

'''Beispiel:''' Dump der Auxiliary Vector auf einem 64-Bit System
{{{
# od -t d8 /proc/self/auxv
0000000                   33      140737005998080
0000020                   16            395049983
0000040                    6                 4096
0000060                   17                  100
0000100                    3              4194368
0000120                    4                   56
0000140                    5                    8
0000160                    7       47114583068672
0000200                    8                    0
0000220                    9              4199104
0000240                   11                37937
0000260                   12                37937
0000300                   13                  400
0000320                   14                  400
0000340                   23                    0
0000360                   15      140737005920569
0000400                    0                    0
0000420
}}}

'''Beispiel:''' Anzeige des Auxiliary Vector durch den Loader beim Starten des Programms
{{{
# LD_SHOW_AUXV=1 /bin/true
AT_SYSINFO_EHDR: 0x7fff16bfd000
AT_HWCAP:        178bfbff
AT_PAGESZ:       4096
AT_CLKTCK:       100
AT_PHDR:         0x400040
AT_PHENT:        56
AT_PHNUM:        8
AT_BASE:         0x2af0ae117000
AT_FLAGS:        0x0
AT_ENTRY:        0x400d60
AT_UID:          37937
AT_EUID:         37937
AT_GID:          400
AT_EGID:         400
AT_SECURE:       0
AT_PLATFORM:     x86_64
}}}

== /proc/pid/cmdline ==
Kommandozeilenargumente dieses Prozesses. Die einzelnen Argumente sind durch 0-Bytes von einander getrennt.

== /proc/pid/coredump_filter ==
Spezifiziert die Speichersegmente die bei einem Coredump dieses Prozesses geschrieben werden.

Die Bitmaske beschreibt, welche Seitentypen in das in den Dump geschrieben werden.

'''Werte: '''
|| '''Bit''' || '''Beschreibung'''                                   ||
|| 0 || Privater anonymer  Speicher                                  ||
|| 1 || Geteilter anonymer Speicher                                  ||
|| 2 || Eingeblendete private Dateien (via {{{mmap(2)}}})            ||
|| 3 || Eingeblendete gemeinsam genutzte Dateien (via {{{mmap(2)}}}) ||
|| 4 || ELF-Header                                                   ||
|| 5 || Private Hugepages                                            ||
|| 6 || Gemeinsam genutzte Hugepages                                 ||
|| 7 || Private DAX-Seiten                                           ||
|| 8 || Gemeinsam genutzte DAX-Seiten                                ||


== /proc/pid/cwd ==
Link auf das aktuelle Arbeitsverzeichnis

== /proc/pid/environ ==
Umgebungsvariablen dieses Prozesses. Die einzelnen Variablen sind durch 0-Bytes von einander getrennt.

== /proc/pid/exe ==
Link auf das Programm dieses Prozesses

== /proc/pid/fd ==
Verzeichnis mit allen offenen Filedeskriptoren als Link auf die betreffende Datei

== /proc/pid/limits ==
Zeigt eine Übersicht über alle Resource Limits des Prozesses inkl. Soft Limit, Hard Limit und Einheit an:
{{{
# cat /proc/$$/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             14644                14644                processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       14644                14644                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
}}}

== /proc/pid/maps ==
Jedes Feld in {{{/proc/pid/maps}}} (mit Ausnahme des Image-Namens) gehört zu einem Feld in ''struct vm_area_struct'' und wird in der folgenden Liste beschrieben:

|| ''Adresse  ''      || Erste und letzte virtuelle Adresse dieses Speicherbereichs ||
|| ''Berechtigungen'' || Eine Bitmaske, die die Zugriffsrechte für das Lesen, Schreiben und Ausführen des Speicherbereichs enthält. Mit diesen Rechten wird angegeben, was der Prozeß mit den zu diesem Bereich gehörenden Seiten machen darf.[[BR]]r = read[[BR]]s= write[[BR]]x = execute[[BR]]s = shared[[BR]]p = private (copy on write)||
|| ''Offset''         || Gibt an, wo der Speicherbereich in der eingeblendeten Datei beginnt. Der Wert 0 bedeutet natürlich, daß die erste Seite des Speicherbereichs der ersten Seite der Datei entspricht.||
|| ''Device''         || Die Major- und Minor-Nummern des Geräts, das die eingeblendete Datei enthält. Verwirrenderweise verweisen die Major- und Minor-Nummern bei Geräte-Einblendungen auf die Gerätedatei, die vom Benutzer geöffnet wurde, und nicht auf das Gerät selbst.                            ||
|| ''Inode''          || Die Inode-Nummer der eingeblendeten Datei.                                              ||
|| ''Pfad''           || Der Name der Datei (normalerweise ein ausführbares Image), die eingeblendet worden ist. Es gibt einige hilfreiche Pseudo-Pfade, wie z.B. Heap, der Stack des Main Threads ({{{[stack]}}}) oder die Stacks von Threads ({{{[stack:<Thread ID>}}}). ||

'''Beispiel:'''
{{{
# cat /proc/4587/maps
00400000-00401000 r-xp 00000000 08:01 796697                             /home/carsten/test_threads
00600000-00601000 r--p 00000000 08:01 796697                             /home/carsten/test_threads
00601000-00602000 rw-p 00001000 08:01 796697                             /home/carsten/test_threads
01d41000-01d62000 rw-p 00000000 00:00 0                                  [heap]
[...]
7ff80307d000-7ff80307e000 ---p 00000000 00:00 0
7ff80307e000-7ff80447e000 rw-p 00000000 00:00 0                          [stack:12774]
[...]
7ffd1351a000-7ffd1353b000 rw-p 00000000 00:00 0                          [stack]
7ffd13563000-7ffd13565000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
}}}

Das Kommando {{{pmaps}}} zeigt die gleichen Informationan an und bereitet sie dabei etwas besser lesbar auf.

== /proc/pid/mem ==
Hauptspeicher der vom Prozeß verwendet wird

== /proc/pid/mountinfo ==
Diese Datei enthält Details zu den einzelnen Mounts.

'''Beispiel:'''
{{{
# cat /proc/self/mountinfo
17 37 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw
18 37 0:16 / /sys rw,nosuid,nodev,noexec,relatime shared:6 - sysfs sysfs rw
[...]
37 1 8:1 / / rw,relatime shared:1 - ext4 /dev/sda1 rw,stripe=64,data=ordered
[...]
79 37 0:36 / /data rw,nosuid,relatime shared:60 - nfs myfiler:/vol/data rw,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.100.1,mountvers=3,mountport=4046,mountproto=udp,local_lock=none,addr=172.20.15.77
}}}

'''Aufbau: '''
|| '''Spalte''' || '''Beschreibung'''                                ||
|| 1  || Eindeutige ID des Mounts                                    ||
|| 2  || ID des übergeordneten Mounts                                ||
|| 3  || Major- und Minor-Nummer des Dateisystems                    ||
|| 4  || Wurzel des Mounts innerhalb des Dateisystems                ||
|| 5  || ount-Punkt relativ zum Root-Verzeichnis des Prozesses       ||
|| 6  || Mount-Optionen                                              ||
|| 7  || Optionale Felder in der Form {{{Tag[:Wert]}}}               ||
|| 8  || Markiert das Ende der optionalen  Felder, ist immer {{{-}}} ||
|| 9  || Typ des Dateisystems in der Form {{{Typ[.Untertyp]}}}       ||
|| 10 || Quelle des Dateisystems                                     ||
|| 11 || Optionen pro Superblock                                     ||

== /proc/pid/mounts ==
Liste aller im Mount Namespace des Prozesses eingebundenen / sichtbaren Dateisysteme. Das Format dieser Einträge entspricht dem in {{{/etc/fstab}}} und ist in fstab(5) beschrieben.

== /proc/pid/mountstats ==
Diese Datei enthält die Konfiguration der einzelnen Mounts. Bei NFS-Shares werden zusätzliche statistische Informationen angezeigt.

'''Beispiel:'''
{{{
# cat /proc/self/mountstats
device rootfs mounted on / with fstype rootfs
device proc mounted on /proc with fstype proc
device sysfs mounted on /sys with fstype sysfs
[...]
device myfiler:/vol/data mounted on /data with fstype nfs statvers=1.1
        opts:   rw,vers=3,rsize=65536,wsize=65536,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.100.1,mountvers=3,mountport=4046,mountproto=udp,local_lock=none
        age:    2931976
        caps:   caps=0x3fe7,wtmult=512,dtsize=32768,bsize=0,namlen=255
        sec:    flavor=1,pseudoflavor=1
        events: 424 196955 1 83 230 86 291924 9 0 24 7 248 126 6 1914 25 0 165 0 0 9 1 0 0 0 0 0
        bytes:  563490 396 0 0 155483 398 52 7
        RPC iostats version: 1.0  p/v: 100003/3 (nfs)
        xprt:   tcp 891 1 1 0 20 197579 197579 0 197580 0 2 0 1
        per-op statistics
                NULL: 0 0 0 0 0 0 0 0
             GETATTR: 424 424 0 48460 47488 0 190 193
             SETATTR: 6 6 0 892 864 0 4 4
              LOOKUP: 133 133 0 17096 26588 0 71 72
              ACCESS: 196315 196315 0 24340608 23557800 433 84865 86154
            READLINK: 4 4 0 440 528 0 1 1
                READ: 24 24 0 2988 158584 0 427 427
               WRITE: 7 7 0 1388 1120 0 3 3
              CREATE: 6 6 0 1028 1632 0 4 4
               MKDIR: 0 0 0 0 0 0 0 0
             SYMLINK: 0 0 0 0 0 0 0 0
               MKNOD: 1 1 0 168 272 0 0 0
              REMOVE: 2 2 0 292 288 0 1 1
               RMDIR: 0 0 0 0 0 0 0 0
              RENAME: 1 1 0 212 260 0 0 0
                LINK: 0 0 0 0 0 0 0 0
             READDIR: 0 0 0 0 0 0 0 0
         READDIRPLUS: 3 3 0 416 18728 0 10 10
              FSSTAT: 153 153 0 17064 25704 0 108 108
              FSINFO: 4 4 0 432 656 0 1 1
            PATHCONF: 1 1 0 108 140 0 0 0
              COMMIT: 0 0 0 0 0 0 0 0
}}}

== /proc/pid/ns/ ==
Dieses Unterverzeichnis enthält einen Eintrag pro veränderbaren Namespace.

== /proc/pid/oom_adj ==
{{{oom_adj}}} und die Lebensdauer des Prozesses sind zwei von mehreren Werten, mit denen die "Badness" des Prozesses für den oom_killer berechnet wird. Das Ergebnis dieser Berechnung steht in {{{oom_score}}}.

 Charakteristik::
 :: Dynamisch änderbar: Ja
 :: Wertebereich: -17 bis +15, -17 deaktiviert den oom_killer
 :: Standard: 0

'''Beispiel:''' oom_killer für den Prozeß mit der PID 8948 deaktivieren
{{{
# cat /proc/8948/oom_score
299
# echo -17 > /proc/8948/oom_adj
# cat /proc/8948/oom_score
0
}}}

== /proc/pid/oom_score ==
Punktzahl, die die "Badness" des Prozesses beschreibt. Der oom_killer beendet den Prozeß mit der höchsten Punktzahl zuerst. Prozesse mit dem Wert 0 werden nicht beendet.

 Charakteristik::
 :: Dynamisch änderbar: Nur lesbar

== /proc/pid/root ==
Link auf das Root-Verzeichnis dieses Prozesses. Über diesen Einträg läßt sich feststellen ob der Prozeß in einer {{{chroot()}}}-Umgebung läuft.

== /proc/pid/smaps ==
Zeigt die Speichernutzung eines Prozesses auf Basis der einzelnen Bereiche dar.

'''Beispiel:'''
{{{
7fa898f87000-7fa898f93000 r-xp 00000000 08:01 407259                     /lib64/libnss_files-2.12.so
Size:                 48 kB
Rss:                  16 kB
Pss:                   0 kB
Shared_Clean:         16 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           16 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
}}}

Die Informationen der ersten Zeile entsprechen den Eintrag in {{{/proc/pid/maps}}}.

Bedeutung der verbleibenden Zeilen:
|| ''Size''            || Größe des Bereichs ||
|| ''Rss''             || Anteil dieses Bereiches, der sich im RAM befindet (Resident Set Size). Dieser Bereich wird nicht mit anderen Prozessen geteilt. ||
|| ''Pss''             || Relativer Anteil an gemeinsam genutzten Seiten (gemeinsam genutzer Speicher / Anzahl der Nutzer) (Proportional Share Size) ||
|| ''Shared_Clean''    || Menge der nicht geänderten gemeinsam genutzten Seiten ||
|| ''Shared_Dirty''    || Menge der geänderten gemeinsam genutzten Seiten ||
|| ''Private_Clean''   || Menge der nicht geänderten privaten Seiten ||
|| ''Private_Dirty''   || Menge der geänderten privaten Seiten ||
|| ''Referenced''      || Menge des Segments, die referenziert wurde oder auf die zugegriffen wurde ||
|| ''Swap''            || In den Swap Space ausgelagerter Speicher ||
|| ''!KernelPageSize'' || Größe einer Seite des Kernels ||
|| ''MMUPageSize''     || Größe einer Seite der MMU ||

Das Kommando {{{pmaps -X}}} zeigt die gleichen Informationan an und bereitet sie dabei etwas besser lesbar auf.

== /proc/pid/stat ==
Prozeßstatus

== /proc/pid/statm ==
Statusinformationen über den Prozeßspeicher.
{{{
# cat /proc/1/statm
126 126 112 7 1 118 9
}}}

'''Bedeutung der Zahlen von links nach rechts:'''
|| ''size ''    || Gesamtgröße des Programmes in Seiten                                        ||
|| ''resident'' || Im Hauptspeicher resistender Teil des Programmes (resistend set size)       ||
|| ''shared''   || Anzahl der number gemeinsam genutzten Seiten (shared)                       ||
|| ''trs''      || Anzahl der Code-Seiten (Text-Segmente)                                      ||
|| ''drs''      || Anzahl der Daten- / Stack-Seiten                                            ||
|| ''lrs''      || Anzahl der Seiten die von Bibliotheken stammen (number of pages of library) ||
|| ''dt''       || Anzahl der "dirty"-Seiten                                                   ||

== /proc/pid/status ==
Zusammenfassung des Inhalts von {{{stat}}} und {{{statm}}} in menschenlesbarer Form
{{{
# cat /proc/1/status
Name:   init
State:  S (sleeping)
Tgid:   1
Pid:    1
PPid:   0
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
Utrace: 0
FDSize: 64
Groups:
VmPeak:    25556 kB
VmSize:    25520 kB
VmLck:         0 kB
VmHWM:      1544 kB
VmRSS:      1336 kB
VmData:      208 kB
VmStk:        88 kB
VmExe:       132 kB
VmLib:      2488 kB
VmPTE:        72 kB
VmSwap:        0 kB
Threads:        1
SigQ:   0/13867
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 00000001a0016623
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: fffffffffffffeff
CapBnd: ffffffffffffffff
Cpus_allowed:   1
Cpus_allowed_list:      0
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        69119
nonvoluntary_ctxt_switches:     47
}}}

 Name:: Dateiname des Programmes
 State::
 :: Zustand des Prozesses
 :: Mögliche Werte:
 || ''D (disk sleep)'' || Prozess wartet auf auf Daten von der Festplatte||
 || ''R (running)''    || Prozess läuft oder wartet in der Run Queue auf seine Ausführung ||
 || ''S (sleeping)''   || Prozess schläft unterbrechbar ||
 || ''T (stopped)''    || Ausführung des Prozesses wurde gestoppt, nach dem dieser eines der Signale ''SIGSTOP'', ''SIGTSTP'', ''SIGTTIN'' oder ''SIGTTOU'' empfangen hat ||
 || ''T (tracing stop)'' || Ausführung des Prozesses wurde durch einen Debugger angehalten ||
 || ''W (waking)'' || Prozeß der gerade aufwacht ||
 || ''X (dead)''   || Letzte Zustand eines Prozesses, während dieser gerade durch das System entfernt wird. Der Wechsel von Zombie nach Dead verhindert Race Conditions Aufrufen von {{{wait()}}} o.ä. durch den Elternprozeß. Diesen Zustand sollte man nie sehen. ||
 || ''Z (zombie)'' || Prozeß wurde beendet und wartet noch auf den Elternprozeß, bis dieser {{{wait()}}} o.ä. aufruft. ||

 Tgid::      Gruppen-ID der Threads
 Pid::       Eigene Prozeß-ID (PID)
 PPid::      PID des Elternprozesses
 TracerPid::
 :: Prozeß-ID des tracenden Prozesses
 :: Hardcodiert immer ''0'' beim 2.4-er Kernel
 Uid::       (reale) UID, effektive UID, gesicherte (saved) UID, UID für Dateisystemzugriffe
 Gid::       (reale) GID, effektive GID, gesicherte (saved) GID, GID für Dateisystemzugriffe
 FDSize::
 :: Maximum von offenen Dateien eines Prozesses.
 :: Dieser Wert wird bei Bedarf erhöht.
 :: Er beschreibt das Maximum von offenen Dateien, die die interne Struktur {{{files_struct}}} eines Prozesses aufnehmen / verwalten kann.

 Groups:: Gruppen in denen der Nutzer des Prozesses Mitglied ist

 VmPeak:: Spitzenwert von !VmSize
 VmSize:: Der gesamte Speicherverbrauch des Prozesses. Enthalten sind Text- und Datensegment, Stack, statische Variablen sowie Seiten, die mir anderen Prozessen geteilt werden.
 VmLck:: Menge des Prozeßspeichers, der aktuell vom Kernel gesperrt ist. Gesperrter Speicher kann nicht ausgelagert werden.
 VmHWM:: Spitzenwert der Resident Set Size ("high water mark")
 VmRSS:: Schätzung des Kernels der Resident Set Size für diesen Prozeß.
 VmData:: Speicher der für den Datenbereich des Prozesses genutzt wird. Statische Variablen und das Datensegment sind im Gegensatz zum Stack enthalten.
 VmStk:: Menge des Speichers der für den Stack des Prozesses verwendet wird.
 VmExe:: Größe der als ausführbar markierten Speicherseiten des Prozesses.
 VmLib:: Größe der Shared Memory-Seiten, die in den Adressbereich dies Prozesses einbelendet wurden. Dies schließt geteilte Seiten aus, die IPC im Stil des System V nutzen.
 VmPTE:: Größe eines Eintrags in der Page Table
 VmSwap:: Größe des in den Swap Space ausgelagerten Speichers

 Threads:: Anzahl der Thread dieses Prozesses
 SigQ::
 :: Die erste Zahl ist die Anzahl der Signale für die reale UID dieses Prozesses, die auf die Abarbeitung warten.
 :: Die zweite Zahl ist die maximale Anzahl von wartenden Signalen für diesen Prozeß (siehe RLIMIT_SIGPENDING in getrlimit(2))
 SigPnd::
 :: Bitmaske aller aller auf die Abarbeitung wartenden Signale für diesen Thread
 ShdPnd::
 :: Bitmaske aller aller auf die Abarbeitung wartenden Signale für diesen Prozeß und aller seiner Threads

 SigBlk:: Bitmaske aller Signale die geblockt sind
 SigIgn:: Bitmaske aller Signale die ignoriert werden
 SigCgt:: Bitmaske aller Signale die empfangen wurden

 CapInh:: Vererbbare Capabilities, diese Fähigkeiten bleiben auch nach dem Aufruf eines anderen Programmes via ''execve()'' erhalten
 CapPrm:: Zulässige Capabilities
 CapEff:: Effektive Capabilities
 CapBnd:: Capability Bounding set

 Cpus_allowed:: Bitmaske aller CPUs auf denen dieser Prozeß laufen kann
 Cpus_allowed_list:: Der Inhalt von ''Cpus_allowed'' als Liste

 Mems_allowed:: Bitmaske aller Memory Nodes die dieser Prozeß nutzen kann
 Mems_allowed_list:: Der Inhalt von ''Mems_allowed'' als Liste

 voluntary_ctxt_switches:: Anzahl der freiwilligen Context Switche
 nonvoluntary_ctxt_switches:: Anzahl der unfreiwilligen Context Switche

== /proc/pid/task ==
In diesem Verzeichnis befinden sich alle Threads dieses Prozesses. Der Aufbau entspricht grundsätzlich dem von {{{/proc/pid}}}.

== /proc/pid/wchan ==
Symbolischer Name der Stelle im Kernel, wo der Prozess "schläft".

{{{
# ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0 37937  7752 13346  16   0   8388   772 -      R+   pts/0      0:00 ps l
0 37937 13346 13345  16   0   9880  1636 wait   Ss   pts/0      0:00 -ksh

# cat /proc/13346/wchan
do_wait
}}}

== Quellen ==
 Manpage ''proc(5)''::
 :: siehe [[proc]]

 Manpage capabilities(7)::
 :: http://man7.org/linux/man-pages/man7/capabilities.7.html

 Manpage fstab(5)::
 :: http://man7.org/linux/man-pages/man5/fstab.5.html

 linux/Documentation/filesystems/proc.txt::

 Linux-Gerätetreiber::
 :: Alessandro Rubini & Jonathan Corbet
 :: 2. Auflage April 2002
 :: ISBN 3-89721-138-6
 :: http://www.oreilly.de/german/freebooks/linuxdrive2ger/mem.html

 Understanding Processes in Linux::
 :: http://wiki.directi.com/x/BQDUAg