web-dev-qa-db-fra.com

Umask actuel d'un processus avec <pid>

Est-il possible d'obtenir actuel mask d'un processus? De /proc/<pid>/... par exemple?

11
basin

Commençant par le noyau Linux 4.7 ( COMMIS ), l'umask est disponible en /proc/<pid>/status.

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

Remarque: cette réponse s'applique aux noyaux de Linux 4.6 et plus tôt. Voir @ Réponse d'Egmont Pour les versions plus récentes du noyau.

L'omasque n'est pas exposé dans les procfs. Il y avait ne tentative pour l'ajouter sans beaucoup de succès.

Il y a moyen d'obtenir l'umask en utilisant gdb, comme cela a été expliqué ici avant :

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

N'oubliez pas que GDB arrête le processus et ses threads, de sorte que le changement temporaire d'omasque est négligeable.

Si c'est bon pour votre cas, vous pouvez utiliser cet ONLINER:

$ 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 que si vous pouvez contrôler le processus en marche, écrire l'umask dans un fichier, une sortie ou quelque chose de similaire et de l'obtenir à partir de là.

15
zuazo

Sur 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 à fs->umask champ du processus correspondant 'task_struct dans le noyau.

4
Stéphane Chazelas