Linux 从pgrep获取单个PID
当我在shell上执行以下命令时,它返回预期的PID,例如4676:Linux 从pgrep获取单个PID,linux,grep,ksh,Linux,Grep,Ksh,当我在shell上执行以下命令时,它返回预期的PID,例如4676: pgrep -f konakart 但是当在脚本上使用这一行时,它返回两个ID—预期的ID,我猜另一个ID来自它自己: # vim test.sh #!/bin/ksh echo $(pgrep -f $1) # ./test.sh konakart 4676 17847 这些行有什么问题?您没有考虑在命令行中输入的命令 在命令行中提交时,您可以正确地看到,只有一个命令在完整描述中使用konakart一词运行 现在您正
pgrep -f konakart
但是当在脚本上使用这一行时,它返回两个ID—预期的ID,我猜另一个ID来自它自己:
# vim test.sh
#!/bin/ksh
echo $(pgrep -f $1)
# ./test.sh konakart
4676 17847
这些行有什么问题?您没有考虑在命令行中输入的命令 在命令行中提交时,您可以正确地看到,只有一个命令在完整描述中使用konakart一词运行 现在您正在调用脚本。。。怎么做
./test.sh konakart
那么现在有多少命令的完整列表中有konakart这个词呢
答案是2,一个你认为你正在寻找的,一个你刚刚提交的,你把这个词放在命令行上调用你的脚本 正如grails回答中提到的,这里是我为icinga剪下的支票:
# vim check_process
#!/bin/ksh
rc=0
#kkPID=$(pgrep -f konakart)
#kkPID=$(ps -ef | awk '/[k]onakart/{print $2}')
#kkPID=$(ps -eo pid,command | grep "konakart" | grep -v grep | awk '{print $1}')
pid=$(pgrep -fl $1 | grep -v "check_process" | sed "s/\(\d*\) .*/\1/")
if [ -z "$pid" ]
then
msg="CRITICAL - No $1 process found"
rc=2
else
msg="OK - $1 runs on PID: $pid"
fi
echo $msg
return $rc
你真的需要-f/-full吗?对我来说看起来像是重复的:而且,不是bash脚本。。。这是一个korn shell脚本,由表示/垃圾箱/ksh@TatsuyukiIshi:我需要完整的输出,因为它通过jvm@fortyfour-不,它不会对命令输出产生影响,但您已经向用户展示了一件事,并表示它有所不同。一个更复杂的脚本,它很可能会有所不同,因为两种语言不支持所有相同的功能和命令:没错。我在上次评论中提到了这一点。但这怎么可能从我的搜索中删除呢?有什么建议吗?你可能需要对全局提出建议?简单的回答是,您可以使用第二个正常的grep with-v选项忽略您的测试。sh谢谢您的提示:我现在使用:echo$pgrep-fl$1 | grep-v test.sh,唯一的事情是删除processname。我还想问一下您为什么要使用echo?您可能还想查看pgrep可用的其他选项,看看它们是否有更好的解决方案。如前所述,在不知道您的实际脚本需求的情况下,我们可以帮助您:我想使用它来检查进程是否正在运行,以检查icinga。为了对不同的进程执行此操作,我传递了不同的参数。出于格式化原因,我粘贴了完整的代码作为答案。根据您是否知道可能只有一个进程在运行,您可以使用pgrep-fo$1,或者如果您知道您要查找的进程是唯一的项目,您可以查看-x选项