Aktuelle Umask eines Prozesses mit <pid>

11

Ist es möglich, die aktuelle Umask eines Prozesses abzurufen? Von /proc/<pid>/...zum Beispiel?

Becken
quelle
1
Wenn Sie mit gdb nicht schwache Nerven haben, gibt es eine nicht so benutzerfreundliche Möglichkeit, diese Informationen hier zu erhalten: stackoverflow.com/questions/165212/…
MelBurslan

Antworten:

20

Ab Linux Kernel 4.7 ( Commit ) ist die Umask in verfügbar /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
egmont
quelle
1
Dies hat in RHEL 7.4 geholfen!
Anand Varkey Philips
Ja, und RHEL7.4 ist 3.10.0, daher verstehe ich den Kommentar zu 4.7 nicht.
Hagello
Richtig, einige ältere Kernel liefern keine Informationen über die Umask, zum Beispiel 2.6.18. Das Feature ist jedoch bereits in 3.10.0 vorhanden. Daher sollten Sie nicht sagen, dass diese Lösung vor Kernel 4.7 nicht funktioniert.
Hagello
Stéphane war so freundlich, meinen Beitrag so zu bearbeiten, dass er auf das Commit verweist, das eindeutig besagt, dass es viel neuer als 3.10 ist, als es hinzugefügt wurde. Vielleicht erschien es viel früher im gepatchten Kernel von RHEL, aber noch nicht im Hauptkernel, ich weiß es nicht.
egmont
15

Hinweis: Diese Antwort gilt für Linux-Kernel 4.6 und früher. Siehe @ egmonts Antwort für neuere Versionen des Kernels.

Die Umask ist in procfs nicht verfügbar. Es wurde versucht , es ohne großen Erfolg hinzuzufügen.

Es gibt eine Möglichkeit, die Umask zu verwenden gdb, wie hier zuvor erläutert wurde :

$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0

Beachten Sie, dass gdb den Prozess und seine Threads stoppt, sodass die vorübergehende Änderung von umask vernachlässigbar ist.

Wenn das für Ihren Fall gut ist, können Sie diesen Oneliner verwenden:

$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077

Eine andere Alternative besteht darin, wenn Sie den laufenden Prozess steuern können, die Umask in eine Datei, eine Ausgabe oder ähnliches zu schreiben und von dort abzurufen.

zuazo
quelle
1
Damit diese Antwort auch beim Googeln dieser Begriffe angezeigt wird , wird auch erläutert, wie Sie die Umask des laufenden Prozesses ändern können (da für das Abrufen diese vorübergehend geändert werden muss). Ich habe es bei der Suche zunächst abgelehnt.
Hugues M.
4

Unter Linux könnten Sie mit systemtap(as root) tun

stap -e 'probe kernel.function("do_task_stat") {
           printf("%o\n", $task->fs->umask);
           exit()
         }
         probe begin {system("cat /proc/4321/stat>/dev/null")}'

Wenn Sie a cat /proc/4321/statausführen, wird diese Prüfung ausgelöst, do_task_statwenn wir auf das fs->umaskFeld des entsprechenden Prozesses task_structim Kernel zugreifen können .

Stéphane Chazelas
quelle