是否可以获得进程当前的 umask?/proc/<pid>/...
例如从?
答案1
从 Linux 内核 4.7 开始(犯罪),umask 可用于/proc/<pid>/status
.
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
答案2
注意:此答案适用于 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 写入文件、输出或类似的内容并从那里获取它。
答案3
在 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")}'
执行 acat /proc/4321/stat
操作将触发该探测,探查我们可以在内核中do_task_stat
访问fs->umask
相应进程的字段的位置。task_struct