Bieżące umask procesu z <pid>

11

Czy można uzyskać aktualny zestaw funkcji? Z /proc/<pid>/...na przykład?

basen
źródło
1
Jeśli nie masz słabego serca za pomocą gdb, istnieje niezbyt przyjazny dla użytkownika sposób na zdobycie tych informacji tutaj: stackoverflow.com/questions/165212/...
MelBurslan

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
egmont
źródło
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.

zuazo
źródło
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.

Stéphane Chazelas
źródło