我已经编写了bash脚本(searchuser
),它应该显示正在执行特定程序或脚本的所有用户(至少是一个bash脚本)。但是当搜索脚本失败时,因为SO正在执行的命令类似于bash scriptname
。
此脚本用于解析ps
命令输出,它搜索指定程序名称的所有匹配项,提取用户和程序名称,验证程序名称是否是我们要搜索的程序名称如果它显示相关信息(在这种情况下是用户名和程序名称,也可能更好地输出PID,但这很简单)。完成验证以拒绝包含程序名称的所有行,这些程序名称包含程序的名称,但它们不是我们正在搜索的程序;如果我们正在搜索gedit
,我们不希望找到sgedit
或gedits
。
我还有其他问题:
脚本必须执行:
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
您是否有建议解决这些问题?
答案 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
显示用户的流程实例数。