在bash中显示系统进程的用户标识

在bash中显示系统进程的用户标识,bash,Bash,我需要创建一个在系统上运行进程的用户ID列表,不管它们是否登录。但是,我在显示完整用户名时遇到问题,以下是我的代码: #!/bin/bash i=0 top -n 1 | while read line do if [ $i -ge 7 ] then check=$(echo $line | awk '{print $3}') if [ $check != "root" ] then user=$(ech

我需要创建一个在系统上运行进程的用户ID列表,不管它们是否登录。但是,我在显示完整用户名时遇到问题,以下是我的代码:

#!/bin/bash

i=0

top -n 1 | while read line
do
    if [ $i -ge 7 ]
    then
        check=$(echo $line | awk '{print $3}')
        if [ $check != "root" ]
        then
            user=$(echo $line | awk '{print $2}')
            echo $user
        fi
    fi

    i=$((i+1))
done

top命令只打印出用户名的前8个字符。是否有top的变体可以为我提供完整的用户ID?

您可以在一行中完成此操作:

ps -eo uid= | tr -d ' ' | grep -vx 0 | sort | uniq
这些步骤是:

  • 打印所有正在运行的进程的UID
  • 修剪空白(因为
    ps
    右对齐数字)
  • 删除所有显示为0的行(例如root用户)
  • 对其余行进行排序,以便将重复项分组在一起
  • 删除相邻的重复项
如果要显示用户名而不是UID号码:

ps -eo user= | grep -vx root | sort | uniq
如下面的注释所述,如果您希望流程的uid或用户名为“真实”(而非“有效”),则可以指定
ruid
ruser
,而不是
uid
。(如果运行setuid程序,“有效”用户是程序的所有者,但“真正”用户仍然是您。)

此外,您还可以将
-c
添加到
uniq
命令中,以获得每个用户拥有多少进程的计数。您甚至可以按进程数再次排序:

ps -eo user= | grep -vx root | sort | uniq -c | sort -nr

ps-eo ruser=如果需要名称而不是UID.Wow。这太棒了。我得到了一些额外的用户,如果你在寻找所有在系统上运行任何东西的用户,那么是什么让用户“额外”呢?是的,没关系。我以为有复制品,但效果很好