Umask corrente di un processo con <pid>


Risposte:


21

A partire dal kernel Linux 4.7 ( commit ), umask è disponibile in /proc/<pid>/status.

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

1
Questo ha aiutato in RHEL 7.4!
Anand Varkey Philips,

Sì, e RHEL7.4 è 3.10.0, quindi non capisco il commento su 4.7.
hagello,

Bene, alcuni kernel più vecchi non forniscono informazioni sull'umask, ad esempio 2.6.18. Tuttavia, la funzionalità è già disponibile in 3.10.0. Pertanto, non si dovrebbe dire che questa soluzione non funziona prima del kernel 4.7.
hagello,

Stéphane è stato così gentile da modificare il mio post per collegarlo al commit che dice chiaramente quando è stato aggiunto, è molto più recente di 3.10. Forse è apparso molto prima nel kernel con patch di RHEL, ma non ancora nel kernel mainline, non lo so.
egmont,

15

Nota: questa risposta si applica ai kernel Linux 4.6 e precedenti. Vedi la risposta di @ egmont per le versioni più recenti del kernel.

La umask non è esposta in procfs. Si è tentato di aggiungerlo senza molto successo.

C'è un modo per ottenere l'umask usando gdb, come è stato spiegato qui prima :

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

Tieni presente che gdb interrompe il processo e i suoi thread, quindi il cambiamento temporaneo di umask è trascurabile.

Se va bene per il tuo caso, puoi usare questo oneliner:

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

Un'altra alternativa è, se puoi controllare il processo in esecuzione, scrivere l'umask in un file, un output o qualcosa di simile e ottenerlo da lì.


1
Solo così questa risposta appare anche quando si cerca su Google quei termini, spiega anche come modificare umask del processo in esecuzione (dal momento che ottenerlo richiede di cambiarlo temporaneamente). Inizialmente l'ho respinto durante la ricerca di questo.
Hugues M.

4

Su Linux, con systemtap(as root), potresti farlo

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

Fare un cat /proc/4321/stattrigger attiverebbe quel probe su do_task_statdove possiamo accedere al fs->umaskcampo del processo corrispondente ' task_structnel kernel.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.