Текущий umask процесса с <pid>

11

Можно ли получить текущее значение процесса? Из /proc/<pid>/...например?

бассейн
источник
1
Если вы не слабонервны в использовании gdb, есть не очень удобный способ получения этой информации здесь: stackoverflow.com/questions/165212/…
MelBurslan

Ответы:

21

Начиная с ядра Linux 4.7 ( commit ), umask доступен в /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
Эгмонт
источник
1
Это помогло в RHEL 7.4!
Ананд Варки Филипс
Да, и RHEL7.4 - 3.10.0, поэтому я не понимаю комментарий о 4.7.
Гагелло
Да, некоторые старые ядра не предоставляют информацию о umask, например, 2.6.18. Тем не менее, функция уже есть в 3.10.0. Таким образом, вы не должны говорить, что это решение не работает до ядра 4.7.
Гагелло
Стефан был достаточно любезен, чтобы отредактировать мой пост, чтобы связать его с коммитом, в котором четко сказано, что когда он был добавлен, он намного новее, чем 3.10. Может быть, это появилось намного раньше в исправленном ядре RHEL, но еще не в основном ядре, я не знаю.
egmont
15

Примечание: этот ответ относится к ядрам Linux 4.6 и более ранним версиям. Смотрите ответ @ egmont для более новых версий ядра.

Umask не выставляется в procfs. Была попытка добавить его без особого успеха.

Существует способ получить Umask gdb, как было объяснено здесь ранее :

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

Помните, что GDB останавливает процесс и его потоки, поэтому временное изменение umask незначительно.

Если это хорошо для вашего случая, вы можете использовать этот oneliner:

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

Другой вариант, если вы можете управлять запущенным процессом, записать umask в файл, вывод или что-то подобное и получить его оттуда.

Zuazo
источник
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")}'

Выполнение a cat /proc/4321/statвызовет эту проверку того, do_task_statгде мы можем получить доступ к fs->umaskполю соответствующего процесса ' task_structв ядре.

Стефан Шазелас
источник