Umask actual de un proceso con <pid>

11

¿Es posible obtener umask actual de un proceso? De /proc/<pid>/...por ejemplo?

cuenca
fuente
1
Si no eres un débil cardíaco usando gdb, hay una manera no tan fácil de usar para obtener esta información aquí: stackoverflow.com/questions/165212/…
MelBurslan

Respuestas:

21

A partir de Linux kernel 4.7 ( commit ), la umask está disponible en /proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022
egmont
fuente
1
¡Esto ayudó en RHEL 7.4!
Anand Varkey Philips
Sí, y RHEL7.4 es 3.10.0, por lo que no entiendo el comentario sobre 4.7.
hagello
Correcto, algunos núcleos más antiguos no proporcionan información sobre la umask, por ejemplo 2.6.18. Sin embargo, la característica ya está allí en 3.10.0. Por lo tanto, no debe decir que esta solución no funciona antes del kernel 4.7.
Hagello
Stéphane tuvo la amabilidad de editar mi publicación para vincularla al commit que claramente dice que cuando se agregó, es mucho más reciente que 3.10. Tal vez apareció mucho antes en el kernel parcheado de RHEL, pero aún no en el kernel principal, no lo sé.
egmont
15

Nota: esta respuesta se aplica a los núcleos de Linux 4.6 y anteriores. Vea la respuesta de @ egmont para las versiones más nuevas del núcleo.

El umask no está expuesto en procfs. Hubo un intento de agregarlo sin mucho éxito.

Hay una manera de usar umask gdb, como se explicó anteriormente :

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

Tenga en cuenta que gdb detiene el proceso y sus hilos, por lo que el cambio temporal de umask es insignificante.

Si eso es bueno para su caso, puede usar este oneliner:

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

Otra alternativa es, si puede controlar el proceso en ejecución, escribir la umask en un archivo, una salida o algo similar y obtenerla desde allí.

zuazo
fuente
1
Solo para que esta respuesta también aparezca al buscar en Google esos términos, también explica cómo modificar umask del proceso en ejecución (ya que obtenerlo requiere cambiarlo temporalmente). Inicialmente lo descarté al buscar esto.
Hugues M.
4

En Linux, con systemtap(as root), podrías hacer

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

Hacer un cat /proc/4321/statactivaría esa sonda sobre do_task_statdónde podemos acceder al fs->umaskcampo del proceso correspondiente ' task_structen el núcleo.

Stéphane Chazelas
fuente