<pid>가있는 프로세스의 현재 umask


11

프로세스의 현재 umask를 얻을 수 있습니까? 에서 /proc/<pid>/...예를 들면?


1
당신이 GDB를 사용하여 심장 약한하지 않은 경우, 여기 INFOR을 얻기의 노 - 그래서 - 사용자 친화적 인 방법이 있습니다 : 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에 대한 의견을 이해하지 못합니다.
hagello

그렇습니다. 일부 오래된 커널은 umask에 대한 정보를 제공하지 않습니다 (예 : 2.6.18). 그러나이 기능은 이미 3.10.0에 있습니다. 따라서이 솔루션이 커널 4.7 이전에는 작동하지 않는다고 말해서는 안됩니다.
hagello

스테판은 내 게시물을 편집하여 커밋에 연결되도록 추가 할 수있을 정도로 친절했습니다. 어쩌면 RHEL의 패치 된 커널에서 훨씬 일찍 나타 났지만 아직 메인 커널에는 없었습니다.
egmont

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의 임시 변경은 무시할 수 있습니다.

그것이 당신의 경우에 좋으면이 oneliner를 사용할 수 있습니다 :

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

또 다른 대안은 실행중인 프로세스를 제어 할 수 있다면 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_statfs->umasktask_struct

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.