用于查找正在执行特定程序的所有用户的脚本

时间:2015-05-26 20:30:20

标签: bash scripting

我已经编写了bash脚本(searchuser),它应该显示正在执行特定程序或脚本的所有用户(至少是一个bash脚本)。但是当搜索脚本失败时,因为SO正在执行的命令类似于bash scriptname

此脚本用于解析ps命令输出,它搜索指定程序名称的所有匹配项,提取用户和程序名称,验证程序名称是否是我们要搜索的程序名称如果它显示相关信息(在这种情况下是用户名和程序名称,也可能更好地输出PID,但这很简单)。完成验证以拒绝包含程序名称的所有行,这些程序名称包含程序的名称,但它们不是我们正在搜索的程序;如果我们正在搜索gedit,我们不希望找到sgeditgedits

我还有其他问题:

  • 我想避免使用tmp文件。
  • 我想与GNU扩展无关。

脚本必须执行:

root# searchuser programname <invio>

脚本searchuser如下:

#!/bin/bash

i=0
search=$1

tmp=`mktemp`
ps -aux | tr -s ' ' | grep "$search" > $tmp

while read fileline
do
    user=`echo "$fileline" | cut -f1 -d' '`
    prg=`echo "$fileline" | cut -f11 -d' '`
    prg=`basename "$prg"`
    if [ "$prg" = "$search" ]; then
        echo "$user - $prg"
        i=`expr $i + 1`
    fi
done < $tmp

if [ $i = 0 ]; then
    echo "No users are executing $search"
fi

rm $tmp

exit $i

您是否有建议解决这些问题?

2 个答案:

答案 0 :(得分:1)

一种方法可能如下:

ps

./command "some argument"的输出不同,后者不区分./command "some" "argument"和{{1}},这将发出输出,正确显示每个用户运行的参数,引用将正确重新运行给定命令

答案 1 :(得分:1)

怎么样:

ps -e -o user,comm | egrep "^[^ ]+ +$1$" | cut -d' ' -f1 | sort -u

*附录*

本声明:

ps -e -o user,pid,comm | egrep "^\s*\S+\s+\S+\s*$1$" | while read a b; do echo $a; done | sort | uniq -c

或者这个:

ps -e -o user,pid,comm | egrep "^\s*\S+\s+\S+\s*sleep$" | xargs -L1 echo | cut -d ' ' -f1 | sort | uniq -c

显示用户的流程实例数。