Unsk atual de um processo com <pid>

11

É possível obter umask atual de um processo? De /proc/<pid>/...por exemplo?

bacia
fonte
1
Se você não é um fraco de coração usando o gdb, existe uma maneira não tão fácil de obter essas informações aqui: stackoverflow.com/questions/165212/…
MelBurslan

Respostas:

21

A partir do kernel 4.7 do Linux ( confirmação ), o umask está disponível no /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
Egmont
fonte
1
Isso ajudou no RHEL 7.4!
Anand Varkey Philips
Sim, e RHEL7.4 é 3.10.0, então não entendo o comentário sobre 4.7.
hagello 18/02
Certo, alguns kernels antigos não fornecem informações sobre o umask, por exemplo 2.6.18. No entanto, o recurso já existe na 3.10.0. Portanto, você não deve dizer que esta solução não funciona antes do kernel 4.7.
hagello 18/02
Stéphane teve a gentileza de editar minha postagem para vincular ao commit que diz claramente que quando foi adicionada, é muito mais recente que a 3.10. Talvez tenha aparecido muito antes no kernel corrigido do RHEL, mas ainda não no kernel da linha principal, não sei.
egmont 18/02
15

Nota: esta resposta se aplica aos kernels Linux 4.6 e versões anteriores. Veja a resposta do @ egmont para versões mais recentes do kernel.

O umask não é exposto no procfs. Houve uma tentativa de adicioná-lo sem muito sucesso.

Existe uma maneira de obter o umask usando gdb, como foi explicado aqui antes :

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

Lembre-se de que o gdb interrompe o processo e seus threads; portanto, a alteração temporária do umask é desprezível.

Se isso for bom para o seu caso, você pode usar este oneliner:

$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077

Outra alternativa é, se você pode controlar o processo em execução, gravar o umask em um arquivo, uma saída ou algo semelhante e obtê-lo a partir daí.

zuazo
fonte
1
Para que essa resposta também apareça ao pesquisar esses termos, ele também explica como modificar umask do processo em execução (já que obtê-lo requer uma alteração temporária). Inicialmente, eu o ignorei ao pesquisar isso.
Hugues M.
4

No Linux, com systemtap(as root), você poderia fazer

stap -e 'probe kernel.function("do_task_stat") {
           printf("%o\n", $task->fs->umask);
           exit()
         }
         probe begin {system("cat /proc/4321/stat>/dev/null")}'

Fazer um cat /proc/4321/statdispararia essa sonda sobre do_task_statonde podemos acessar o fs->umaskcampo do processo correspondente ' task_structno kernel.

Stéphane Chazelas
fonte