Answers:
从Linux内核4.7(commit)开始,umask在中可用/proc/<pid>/status
。
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
注意:此答案适用于Linux 4.6或更早版本的内核。有关内核的较新版本,请参见@egmont的答案。
umask未在procfs中公开。有一个尝试添加它没有取得多大成功。
有一种使用来获取umask的方法gdb
,如前所述:
$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0
请记住,gdb停止了进程及其线程,因此对umask的临时更改可以忽略不计。
如果这对您的情况有好处,则可以使用此oneliner:
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077
另一种选择是,如果您可以控制正在运行的进程,则可以将umask写入文件,输出或类似内容,然后从那里获取它。
在Linux上,您可以使用systemtap
(as root
)
stap -e 'probe kernel.function("do_task_stat") {
printf("%o\n", $task->fs->umask);
exit()
}
probe begin {system("cat /proc/4321/stat>/dev/null")}'
这样做cat /proc/4321/stat
会触发do_task_stat
我们可以访问内核中fs->umask
相应进程的字段的探针task_struct
。