特定のプロセスが実行されているかどうかをテストできない場合があります。

特定のプロセスが実行されているかどうかをテストできない場合があります。

なぜ私のスクリプトを理解していないのですか?時々、私の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これにより、出力を解析する試みがなくなります。

関連情報