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


11

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


1
あなたはGDBを用いて心臓の弱い人でない場合は、ここではこのインフォアを取得する無SO-ユーザーフレンドリーな方法があります:stackoverflow.com/questions/165212/...
MelBurslan

回答:


21

Linuxカーネル4.7(コミット)以降、umaskはで使用できます/proc/<pid>/status

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

1
これはRHEL 7.4で役立ちました!
Anand Varkey Philips、

はい、RHEL7.4は3.10.0なので、4.7に関するコメントを理解できません。
ハゲロ

確かに、一部の古いカーネルはumaskに関する情報を提供していません(例:2.6.18)。ただし、この機能はすでに3.10.0にあります。したがって、カーネル4.7より前のバージョンではこのソリューションが機能しないと言ってはいけません。
ハゲロ

Stéphaneは私の投稿を編集して、いつ追加されたのかを明確に告げるコミットにリンクするほど親切でした。それは3.10よりはるかに新しいものです。おそらくそれはRHELのパッチを当てたカーネルのかなり前に現れたかもしれませんが、メインラインカーネルにはまだ現れていません、私にはわかりません。
エモント

15

注:この回答は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をファイル、出力などに書き込んでそこから取得することです。


1
ちょうどこの回答はそれらの用語をグーグルするときにも表示され、実行中のプロセスのumaskを変更する方法も説明します(取得するには一時的に変更する必要があるため)。これを検索したとき、私は最初にそれを却下しました。
Hugues M.

4

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->umaskに対応するプロセスの分野をtask_struct核にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.