À partir du noyau Linux 4.7 (commit), le umask est disponible dans /proc/<pid>/status
.
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
L'umask n'est pas exposé dans procfs. Il y a eu une tentative de l'ajouter sans grand succès.
Il existe un moyen d'obtenir le umask en utilisant gdb
, comme cela a été expliqué ici auparavant :
$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0
Gardez à l'esprit que gdb arrête le processus et ses threads, donc le changement temporaire de umask est négligeable.
Si cela vous convient, vous pouvez utiliser ce oneliner :
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077
Une autre alternative est, si vous pouvez contrôler le processus en cours, d'écrire le umask dans un fichier, une sortie ou quelque chose de similaire et de l'obtenir à partir de là.
Sous Linux, avec systemtap
(comme root
), vous pourriez faire
stap -e 'probe kernel.function("do_task_stat") {
printf("%o\n", $task->fs->umask);
exit()
}
probe begin {system("cat /proc/4321/stat>/dev/null")}'
Faire un cat /proc/4321/stat
déclencherait cette sonde sur do_task_stat
où nous pouvons accéder au fs->umask
champ du traitement correspondant' task_struct
dans le noyau.