Linux 查看運行中進程的 umask
線上某臺虛機因為故障重裝了系統(基線 CentOS 6.9 內核 2.6.x),重新部署了應用。這個應用會生成一個文件,到NFS掛載目錄。
而這個 NFS 掛載目錄是一個 FTP 服務器的目錄。另一臺虛機登陸 FTP 服務下載該文件時,提示沒有權限。
重裝的系統由于等保三級的要求,umask=0077。這會導致應用生成文件時默認的權限為 600 。
而登陸 FTP 的用戶名是 FTP 主機上單獨創建的一個用戶,與主機的通用用戶名不同,所以下載文件時出現權限問題。
如果要查看正在運行的進程 mask 信息,可以使用 gdb 工具:
$ gdb --pid=<your pid>
...
(gdb) call/o umask(0)
$1 = 077 # 進程 mask 信息
(gdb) call umask($1) # 恢復進程 umask
$2 = 0
(gdb) quit
也可以用一行非交互式的 gdb 命令得到:
(注意:通過上面交互式的方式對一個JAVA進程操作時,出現了 segmentation fault,進程崩潰。但通過以下命令獲取umask對進程無影響)
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=<your pid> 2> /dev/null | awk '$1 == "$1" {print $3}'
原理:gdb 可以調試正在運行的進程,由于 umask 是 glibc 的庫函數,所以我們可以直接執行 umask 函數。
定義函數: mode_t umask(mode_t mask);
函數說明: umask()會將系統umask值設成參數mask&0777后的值,然后將先前的umask值返回。
由于 umask 函數定義的參數和返回值如上,所以在執行后需要再恢復原來的 umask 值。
另一個簡單的方法:
如果 Linux 內核的版本比較高(如 3.10 及以上),也可以直接從進程的 proc 文件中獲取
$ grep Umask /proc/<your pid>/status

浙公網安備 33010602011771號