특정 프로세스가 실행 중인지 테스트할 수 없는 경우도 있습니다.

특정 프로세스가 실행 중인지 테스트할 수 없는 경우도 있습니다.

왜 내 스크립트를 이해하지 못합니까?때때로, 내 Firefox가 실행 중인지 알 수 없습니다. 표준 출력을 분석해 보면 if ps cax | grep firefox > /dev/nullFirefox가 실행 중임에도 불구하고 이 조건()이 때때로 건너뛰는 것을 알 수 있습니다 .

현재 Xubuntu 18.10 Livecd를 사용하고 있습니다.

이 스크립트는 시작 시 호출됩니다.

#!/bin/bash 

[[ -f /home/xubuntu/controle_memoria.lock ]] && exit 1
> /home/xubuntu/controle_memoria.lock

while true ; do 
free=`free -m | grep Mem | awk '{print $4}'`
if [ "$free" -gt 0 ]
 then
    if [ $free -le 120 ]; #When my memory consuptiom goes below 120MB do the commands below. 
     then

if ps cax | grep firefox > /dev/null
then
        sudo killall -9 firefox-bin         
        firefox &> /dev/null &

else
    echo "Stopped"
fi

        sudo sysctl -w vm.drop_caches=3
        sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 



    fi
fi & sleep 1; done

답변1

  1. ps에는 -C옵션이 있으며 grep은 필요하지 않습니다.
  2. killall -0 firefox-bin종료 코드는 firefox-bin 프로세스가 존재하는지 여부를 알려줍니다. 원시 파이프와 리디렉션이 필요하지 않습니다.
  3. 그냥 삭제 if ps하고 나가세요 killall -9 firefox-bin && firefox-bin &> /dev/null &. 따라서 프로세스가 종료되지 않으면 시작되지 않습니다.

답변2

if ps블록을 다음으로 교체 하면 어떻게 되나요?

for proc in /proc/*
do
    if [[ $(readlink -f ${proc}/exe) = "/usr/bin/firefox-bin" ]]
        sudo killall -9 firefox-bin
        firefox &> /dev/null &
    else
        echo "Stopped"
    fi
done

ps이렇게 하면 출력을 구문 분석하려는 시도가 제거됩니다 .

관련 정보