使用<pid>的进程的当前umask


Answers:


21

从Linux内核4.7(commit)开始,umask在中可用/proc/<pid>/status

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

1
这在RHEL 7.4中有所帮助!
安南·瓦尔基·菲利浦斯

是的,RHEL7.4是3.10.0,所以我不理解关于4.7的评论。
hagello

正确,一些较旧的内核不提供有关umask的信息,例如2.6.18。但是,该功能已在3.10.0中提供。因此,您不应说此解决方案在内核4.7之前不起作用。
hagello

斯特凡(Stéphane)很友善地编辑我的帖子,以链接到明确表示添加后即比3.10更新得多的提交。也许它早在RHEL的修补内核中出现了,但是在主线内核中还没有出现,我不知道。
egmont

15

注意:此答案适用于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写入文件,输出或类似内容,然后从那里获取它。


1
恰好在搜索这些术语时也会显示此答案,它还说明了如何修改正在运行的进程的umask(因为获取它需要临时更改它)。我最初在搜索此文件时将其关闭。
Hugues M.

4

在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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.