A partire dal kernel Linux 4.7 (commit), umask è disponibile in /proc/<pid>/status
.
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
L'umask non è esposto in procfs. C'è stato un tentativo di aggiungerlo senza molto successo.
C'è un modo per ottenere l'umask usando gdb
, come è stato spiegato qui prima:
$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0
Tieni presente che gdb interrompe il processo e i suoi thread, quindi la modifica temporanea di umask è trascurabile.
Se va bene per il tuo caso, puoi usare questo oneliner:
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077
Un'altra alternativa è, se puoi controllare il processo in esecuzione, scrivere l'umask in un file, un output o qualcosa di simile e prenderlo da lì.
Su Linux, con systemtap
(come root
), potresti farlo
stap -e 'probe kernel.function("do_task_stat") {
printf("%o\n", $task->fs->umask);
exit()
}
probe begin {system("cat /proc/4321/stat>/dev/null")}'
Facendo un cat /proc/4321/stat
attiverebbe quella sonda su do_task_stat
dove possiamo accedere al fs->umask
campo del processo corrispondente' task_struct
nel kernel.