You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合ps命令与用户列表文件筛选无运行进程的用户?

找出无进程运行的系统用户脚本方案

假设你已经有了存着系统用户名的列表文件(比如命名为user_list.txt,每行一个用户名),下面是两种实用的bash脚本实现,结合ps命令来筛选出当前没有任何进程在运行的用户:

基础版脚本

适合用户列表不大的场景,逻辑直观:

#!/bin/bash

USER_LIST="./user_list.txt"

# 先检查文件是否存在
if [ ! -f "$USER_LIST" ]; then
    echo "Error: 用户名列表文件 $USER_LIST 不存在"
    exit 1
fi

# 抓取当前有进程运行的所有真实用户(去重)
ACTIVE_USERS=$(ps -e -o uid= | xargs -I {} id -nu {} | sort -u)

# 遍历用户列表,筛选无进程的用户
echo "当前无进程运行的用户:"
while read -r USER; do
    # 跳过空行和以#开头的注释行
    [[ -z "$USER" || "$USER" == "#"* ]] && continue
    # 精确匹配,检查用户是否不在活跃列表里
    if ! echo "$ACTIVE_USERS" | grep -qxF "$USER"; then
        echo "$USER"
    fi
done < "$USER_LIST"

关键命令解释

  • ps -e -o uid=:列出系统所有进程的真实UID(RUID),-o uid=会去掉默认表头,只输出纯UID数值
  • xargs -I {} id -nu {}:把每个UID转换成对应的用户名,-n指定输出用户名,-u表示根据UID查询
  • sort -u:对活跃用户名去重,避免同一个用户多次出现在列表里
  • grep -qxF "$USER":精确匹配用户名,-x确保整行匹配,-F按纯字符串匹配而非正则,-q静默执行不输出冗余内容

高效版脚本

如果你的用户列表很大,用comm命令对比排序后的列表会更高效:

#!/bin/bash

USER_LIST="./user_list.txt"

if [ ! -f "$USER_LIST" ]; then
    echo "Error: 用户名列表文件 $USER_LIST 不存在"
    exit 1
fi

# 创建临时文件存储活跃用户列表
ACTIVE_TMP=$(mktemp)
ps -e -o uid= | xargs -I {} id -nu {} | sort -u > "$ACTIVE_TMP"

# 用comm找出仅在用户列表中存在的用户(即无进程运行的)
echo "当前无进程运行的用户:"
comm -23 <(sort "$USER_LIST") "$ACTIVE_TMP"

# 清理临时文件
rm "$ACTIVE_TMP"

高效逻辑说明

  • comm -23 file1 file2:只输出file1独有的行,-2隐藏file2独有的内容,-3隐藏两者共有的内容
  • <(sort "$USER_LIST"):进程替换,直接把排序后的用户列表作为comm的第一个输入
  • 临时文件存储活跃用户,避免重复执行ps和转换操作,提升大列表场景下的效率

注意点

  • 确保user_list.txt每行只有一个用户名,脚本已处理空行和注释行,但尽量保持列表整洁
  • 如果只想检查普通用户,生成user_list.txt时可以过滤UID≥1000的用户(不同系统可能有差异,比如macOS是UID≥500)
  • ps -o uid=获取的是真实UID,避免了SUID/SGID进程导致的用户识别错误,结果更准确

内容的提问来源于stack exchange,提问作者Gabzxx_23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:36