Umask saat ini dari suatu proses dengan <pid>

11

Apakah mungkin mendapatkan umask proses saat ini? Dari /proc/<pid>/...misalnya?

baskom
sumber
1
Jika Anda tidak pingsan menggunakan gdb, ada cara yang tidak ramah untuk mendapatkan informasi ini di sini: stackoverflow.com/questions/165212/…
MelBurslan

Jawaban:

21

Dimulai dengan kernel Linux 4.7 ( komit ), umask tersedia di /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
egmont
sumber
1
Ini membantu dalam RHEL 7.4!
Anand Varkey Philips
Ya, dan RHEL7.4 adalah 3.10.0, jadi saya tidak mengerti komentar tentang 4.7.
hagello
Benar, beberapa kernel lama tidak memberikan info tentang umask, misalnya 2.6.18. Namun, fitur tersebut sudah ada di 3.10.0. Jadi, Anda seharusnya tidak mengatakan bahwa solusi ini tidak berfungsi sebelum kernel 4.7.
hagello
Stéphane cukup baik untuk mengedit posting saya untuk menautkan ke komit yang dengan jelas mengatakan ketika ditambahkan, itu jauh lebih baru dari 3,10. Mungkin itu muncul jauh lebih awal di patch RHEL yang ditambal, tetapi belum di kernel arus utama, saya tidak tahu.
egmont
15

Catatan: jawaban ini berlaku untuk kernel Linux 4.6 dan sebelumnya. Lihat @ egmont jawaban untuk versi kernel yang lebih baru.

Umask tidak terekspos dalam proksi. Ada upaya untuk menambahkannya tanpa banyak keberhasilan.

Ada cara untuk menggunakan umask gdb, seperti yang telah dijelaskan di sini sebelumnya :

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

Perlu diingat bahwa gdb menghentikan proses dan utasnya, sehingga perubahan sementara umask dapat diabaikan.

Jika itu cocok untuk kasus Anda, Anda dapat menggunakan oneliner ini:

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

Alternatif lain adalah, jika Anda dapat mengontrol proses yang sedang berjalan, untuk menulis umask ke file, output atau yang serupa dan mendapatkannya dari sana.

zuazo
sumber
1
Hanya saja jawaban ini juga muncul ketika mencari istilah-istilah tersebut di Google, ia juga menjelaskan cara memodifikasi umask dari proses yang sedang berjalan (karena untuk mendapatkannya diperlukan untuk sementara waktu mengubahnya). Saya awalnya menolaknya saat mencari ini.
Hugues M.
4

Di Linux, dengan systemtap(as root), Anda bisa melakukannya

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

Melakukan suatu cat /proc/4321/statakan memicu penyelidikan itu di do_task_statmana kita dapat mengakses fs->umaskbidang proses yang sesuai ' task_structdi kernel.

Stéphane Chazelas
sumber