Openwrt下获取进程pid的实用shell

 摘要: 最近陷入各种基于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
}

最后发现: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



本文章由作者:佐须之男 整理编辑,原文地址: Openwrt下获取进程pid的实用shell
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐