web-dev-qa-db-ja.com

<pid>を使用したプロセスの現在のumask

プロセスの現在のumaskを取得することは可能ですか?たとえば/proc/<pid>/...から?

11
basin

Linuxカーネル4.7( commit )以降、umaskは/proc/<pid>/status

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

注:この回答はLinuxカーネル4.6以前に適用されます。カーネルの新しいバージョンについては @ egmontの回答 を参照してください。

Umaskはprocfsで公開されていません。 試行 があり、あまり成功せずに追加されました。

説明されているように、gdbを使用してumaskを取得する方法があります 前の例

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

Gdbはプロセスとそのスレッドを停止するため、umaskの一時的な変更は無視できることに注意してください。

それがあなたのケースに適している場合は、このワンライナーを使用できます:

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

もう1つの方法は、実行中のプロセスを制御できる場合は、umaskをファイル、出力、または同様のものに書き込み、そこから取得することです。

15
zuazo

Linuxでは、systemtapを(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->umasktask_structフィールドにアクセスできます。

4