한 번만 실행하려는 스크립트가 있습니다. 스크립트가 두 번째로 호출되면 lockfile이 있는지 확인합니다. lockfile이 존재하면 프로세스가 실제로 실행 중인지 확인하고 싶습니다.pgrep을 사용하여 프로세스가 실행 중인지 확인
나는 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"를 얻습니다.
아이디어가 있으십니까? 나는 그것이 내가 부르는 방식이라고 확신한다. 나는 여러 가지 조합을 시도해 보았고 그것을 이해하는 것처럼 보일 수 없다.
해결책 : 내가하고 결국 무엇
이 (내 스크립트의 일부를)하고 있었다 : pgrep을위한
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!"
'$ ps -elf | grep processname'을 실행하십시오. –
사소한 코드로,'[\'grep something | wc -l \'-gt 0]'은'grep something'으로 단순화 될 수 있습니다. http://partmaps.org/era/unix/award-example-backticks.html – tripleee
고맙습니다. 그래서 당신은이에 대한 말 : 경우 [$ (추신 -elf | 그렙 $ (고양이 $의 LOCKFILE) | 그렙 $ (기본 이름 $ 0) | 화장실 -l) -gt 0]이에 대한 대체 : [경우 $ (추신 -elf | 그렙 $ (고양이 $의 LOCKFILE) | 그렙 $ (기본 이름 $ 0))] 내가 제대로 이해 했습니까? – jared