Bieżące umask procesu z <pid>


Odpowiedzi:


21

Począwszy od jądra Linuksa 4.7 ( zatwierdzenie ), umask jest dostępny w /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022

1
Pomogło to w RHEL 7.4!
Anand Varkey Philips

Tak, a RHEL7.4 to 3.10.0, więc nie rozumiem komentarza dotyczącego 4.7.
hagello

Racja, niektóre starsze jądra nie dostarczają informacji o umask, na przykład 2.6.18. Jednak funkcja jest już dostępna w 3.10.0. Dlatego nie powinieneś mówić, że to rozwiązanie nie działa przed jądrem 4.7.
hagello

Stéphane był na tyle miły, że mogłem edytować mój post, aby zamieścić link do zatwierdzenia, który wyraźnie mówi, że kiedy został dodany, jest znacznie nowszy niż 3.10. Może pojawił się znacznie wcześniej w łatanym jądrze RHEL, ale jeszcze nie w jądrze głównym, nie wiem.
egmont

15

Uwaga: ta odpowiedź dotyczy jądra Linuksa 4.6 i wcześniejszych. Zobacz odpowiedź @ egmont na nowsze wersje jądra.

Umask nie jest ujawniany w procfs. Była to próba , aby dodać go bez większego sukcesu.

Istnieje sposób na użycie umask gdb, jak wyjaśniono wcześniej :

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

Należy pamiętać, że gdb zatrzymuje proces i jego wątki, więc tymczasowa zmiana umask jest znikoma.

Jeśli jest to dobre dla twojego przypadku, możesz użyć tego oneliner:

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

Inną alternatywą jest, jeśli możesz kontrolować działający proces, zapisać umask do pliku, wyjścia lub czegoś podobnego i pobrać go stamtąd.


1
Właśnie dlatego ta odpowiedź pojawia się również podczas przeglądania tych terminów, wyjaśnia również, jak zmodyfikować umaskę uruchomionego procesu (ponieważ uzyskanie go wymaga tymczasowej zmiany). Początkowo odrzuciłem to podczas wyszukiwania.
Hugues M.

4

W systemie Linux z systemtap(as root) możesz to zrobić

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

Wykonanie cat /proc/4321/statwywołałoby sondę, w do_task_statktórej możemy uzyskać dostęp do fs->umaskpola odpowiedniego procesu task_structw jądrze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.