如何打印所有运行进程的用户名及umask值?现有命令需补充用户名输出
同时输出进程用户名与Umask值的解决方案
你可以通过以下几种方式改进原有命令,实现同时输出用户名和对应的Umask值:
方法一:循环读取用户名与PID
ps gaux | awk '{print $1, $2}' | while read user pid; do umask_val=$(grep -i Umask /proc/$pid/status | awk '{print $2}') echo "$user $pid $umask_val" done
- 先用
awk '{print $1, $2}'从ps gaux的输出中提取用户名(第一列)和PID(第二列) - 通过
while read user pid同时读取这两个字段 - 从
/proc/$pid/status中过滤出Umask值,最后将用户名、PID和Umask值一起打印
如果想避免无权限读取进程文件时的错误提示,可以添加权限判断:
ps gaux | awk '{print $1, $2}' | while read user pid; do if [ -r "/proc/$pid/status" ]; then umask_val=$(grep -i Umask /proc/$pid/status | awk '{print $2}') echo "$user $pid $umask_val" else echo "$user $pid 无权限读取进程信息" fi done
方法二:用Awk一次性处理(避免循环)
ps gaux | awk '{ cmd = "grep -i Umask /proc/" $2 "/status" if ((cmd | getline umask_line) > 0) { split(umask_line, umask_arr) print $1, $2, umask_arr[2] } else { print $1, $2, "无法获取Umask" } close(cmd) }'
- Awk内部直接调用
grep命令获取对应PID的Umask行 - 用
getline读取命令输出,判断是否成功获取内容 - 拆分Umask行得到具体值后,和用户名、PID一起输出
- 用
close(cmd)关闭命令管道,避免资源泄漏
内容的提问来源于stack exchange,提问作者thebjorn
相关产品推荐
相关产品推荐

