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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |