一段查询自身是否已在运行的脚本test.sh,有些要注意到地方

来源:互联网 发布:平板显示无法加入网络 编辑:程序博客网 时间:2024/05/16 14:11

#!/bin/bash
#必须有上面一行,否则ps显示的进程是bash,而不是test.sh


isprocrunning(){
        echo "check $1 is running or not"
        local p=`ps -C $1 -o pid=`     #如果多个同名进程在运行,则$p如:"1111 2222"
        for pid in $p; do
             if [ $pid -ne $$ ]; then       #检查ps到的进程是否为自己,必须这样做
                 echo "another proc $pid is running"
                 return 1
             else
                 echo "local pid is $pid"
             fi
        done
        return 0
}

 

#测试一下
isprocrunning `basename $0`
if [ $? -eq 1 ]; then
    echo "is running"
    sleep 10
else
    sleep 20
fi

 

 

/////////////////////////////////////////////////////////////////

#另一段代码,

isprocrunning(){

local user=`whoami`

echo `ps -u root -f|grep $1|grep -v grep`

local procs=`ps -u $user -f |grep $1 |grep -v grep | gawk'{print $2}'`

for pid in $procs; do

if [ $pid -ne $$ ]; then

echo $pid

return 1;

fi

done

return 0

}

 

#但是使用如下方式执行时会失败,总是显示脚本在运行

#原因是系统会启动一个子shell执行``中的函数,并且ps出来的父子shell进程的命令参数完全一样!

aa=`isprocrunning script_name`

原创粉丝点击