gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:14:17 25 4
gpt4 key购买 nike

我有一个脚本,我只想运行一次。如果脚本第二次被调用,我会检查它是否存在锁定文件。如果锁文件存在,那么我想看看进程是否真的在运行。

我一直在摆弄 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 ,它将匹配任何具有 test 后跟的进程任何字符,最后跟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

关于bash - 使用 pgrep 确定进程是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com