加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 使用pgrep确定进程是否正在运行

发布时间:2020-12-15 20:58:00 所属栏目:安全 来源:网络整理
导读:我有一个脚本,我只想运行一次.如果脚本第二次被调用,我会检查它是否存在锁定文件.如果锁存文件存在,那么我想看看进程是否实际运行. 我一直在搞乱pgrep,但没有得到预期的结果: #!/bin/bashCOUNT=$(pgrep $(basename $0) | wc -l)PSTREE=$(pgrep $(basename $
我有一个脚本,我只想运行一次.如果脚本第二次被调用,我会检查它是否存在锁定文件.如果锁存文件存在,那么我想看看进程是否实际运行.

我一直在搞乱pgrep,但没有得到预期的结果:

#!/bin/bash
COUNT=$(pgrep $(basename $0) | wc -l)
PSTREE=$(pgrep $(basename $0) ; pstree -p $$)
echo "###"
echo $COUNT
echo $PSTREE
echo "###"
echo "$(basename $0) :" `pgrep -d,$(basename $0)`
echo sleeping.....
sleep 10

我得到的结果是:

$./test.sh  
###
2
2581 2587 test.sh(2581)---test.sh(2587)---pstree(2591)
###
test.sh : 2581
sleeping.....

我不明白为什么当只有一个进程实际运行时我得到一个“2”.

有任何想法吗?我确定这就是我打电话的方式.我已经尝试了许多不同的组合,似乎无法弄明白.

解:

我最终做的是这样做(我的部分脚本):

function check_lockfile {
    # Check for previous lockfiles

    if [ -e $LOCKFILE ] 
    then
        echo "Lockfile $LOCKFILE already exists.  Checking to see if process is actually running...." >> $LOGFILE 2>&1
        # is it running?
        if [ $(ps -elf | grep $(cat $LOCKFILE) | grep $(basename $0) | wc -l) -gt 0 ]
        then
            abort "ERROR! - Process is already running at PID: $(cat $LOCKFILE).  Exitting..."
        else
            echo "Process is not running.  Removing $LOCKFILE" >> $LOGFILE 2>&1
            rm -f $LOCKFILE
        fi
    else
        echo "Lockfile $LOCKFILE does not exist." >> $LOGFILE 2>&1
    fi
}

function create_lockfile {
    # Check for previous lockfile
    check_lockfile

    #Create lockfile with the contents of the PID
    echo "Creating lockfile with PID:" $$>> $LOGFILE 2>&1
    echo -n $$> $LOCKFILE
    echo "" >> $LOGFILE 2>&1
}

# Acquire lock file
create_lockfile >> $LOGFILE 2>&1 
|| echo "ERROR! - Failed to acquire lock!"

解决方法

pgrep的参数是扩展的正则表达式模式.
在你的情况下,命令pgrep $(basename $0)将评估为pgrep test.sh,它将匹配任何具有测试的进程,后跟任何字符,最后是sh.所以它会匹配btest8sh,atest_shell等.

您应该创建一个锁文件.如果锁定文件存在,程序应该退出.

lock=$(basename $0).lock
if [ -e $lock ] 
then 
    echo Process is already running with PID=`cat $lock`
    exit
else
    echo $$> $lock
fi

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读