Umsk atual de um processo com pid

9

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

    
por basin 28.01.2016 / 15:48

3 respostas

15

Nota: esta resposta aplica-se aos kernels 4.6 e anteriores do Linux. 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 da umask é insignificante.

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 de lá.

    
por 28.01.2016 / 17:12
15

Começando com o kernel Linux 4.7 ( commit ), o umask está disponível em /proc/<pid>/status .

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
    
por 28.03.2017 / 12:14
4

No Linux, com systemtap (como 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/stat acionaria esse probe em do_task_stat , onde poderíamos acessar o campo fs->umask do processo correspondente ' task_struct no kernel.

    
por 29.01.2016 / 14:13

Tags