您的位置:首页 > 运维架构 > Shell

Openwrt下获取进程pid的实用shell

2016-05-11 00:00 645 查看
摘要: 最近陷入各种基于openwrt的系统中,有的是原版opwrt,有的是修改过的openwrt,以致有的系统命令被阉割,有的系统命令被保留,导致shell在一类设备上运行ok,在另类设备上运行不ok。查询进程号pid就是一个例子。
查询进程pid常用shell命令:ps,pgrep,top
其中ps aux和ps -ef不是全部设备都支持;
pgrep "XXX"也不太灵光,比如我自己的后台脚本程序就靠名字拿不到pid;
最后是用的top命令来兼顾所有的不同openwrt设备都能拿到程序的进程号。

查询某个名字进程的pid shell函数如下:
函数成功会返回当前进程的pid,如果不在该进程返回null,没有传入程序名称返回-1
#!/bin/sh
GetPidByCommand(){
if [ ! -n "${1}" ]
then
echo "-1"
fi

ptop=$(top -n 1 |grep "${1}" |grep -v "grep ${1}")
pid=""

startpos=0
stringlen=${#ptop}
startstatus=0

while [ 1 ]
do
if [ ${startpos} -ge ${stringlen} ]
then
break
fi

currchar=${ptop:${startpos}:1}

if [ "${currchar}" = "0" ] || [ "${currchar}" = "1" ] || [ "${currchar}" = "2" ] || [ "${currchar}" = "3" ] || [ "${currchar}" = "4" ] || [ "${currchar}" = "5" ] || [ "${currchar}" = "6" ] || [ "${currchar}" = "7" ] || [ "${currchar}" = "8" ] || [ "${currchar}" = "9" ]
then
if [ ${startstatus} -eq 0 ]
then
startstatus=1
fi

pid=${pid}${currchar}
elif [ ${startstatus} -eq 1 ]
then
break
fi

startpos=$(expr ${startpos} + 1 )
done

echo ${pid}

}

pid=$(GetPidByCommand "Test001")

echo "Test001 pid = ${pid}"

exit 0

最后发现:pgrep -f "XXX"可以搞定 囧
Usage: pgrep [-flnovx] [-s SID|-P PPID|PATTERN]

Display process(es) selected by regex PATTERN

-l      Show command name too
-f      Match against entire command line
-n      Show the newest process only
-o      Show the oldest process only
-v      Negate the match
-x      Match whole name (not substring)
-s      Match session ID (0 for current)
-P      Match parent process ID
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息