解決策

解決策

「enigma2」というプロセスが存在しないときに変数をゼロで埋めるスクリプトを作成しようとしています。

このスクリプトを実行すると...

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

出力が出ます...

0  
0  

これがまさに私が期待したものです。

しかし、このスクリプトを実行すると、次のようになります。

#!/bin/sh

# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
    # If enigma2 is running then kill it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
    echo $ENIGMA_PID
    echo "$ENIGMA_PID"

    re='^[0-9]+([.][0-9]+)?$'
    if ! [[ $ENIGMA_PID =~ $re ]] ; then
       echo "error: Not a number" >&2; exit 1
    else
        echo "It IS a number"
    fi

        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo $ENIGMA_PID
            echo "$ENIGMA_PID"
            echo "enigma2 is running"
            killall enigma2
        else
            echo "enigma2 is not running"       
        fi
    # Check if minisatip is running already, if not then start it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is already running"
        else
            echo "minisatip is not running"
            echo "starting minisatip"
            /usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html       
        fi
else
    # The no_enigma file does not exist
    # Check if minisatip is running, if yes then kill it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is running, killing it now"
            killall minisatip
        else
            echo "minisatip is not running"
        fi  
    # Check if enigma2 is running already, if not then start it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo "enigma2 is already running"
        else
            echo "enigma2 is not running"
            echo "starting enigma2"
            /home/root/run_enigma.sh            
        fi
fi

私はこの出力を取得します...

2  
2  
It IS a number  
2  
2  
enigma2 is running  
killall: enigma2: no process killed  
minisatip is already running 

#!/bin/sh2番目のスクリプトの一番上から削除すると、予想される出力が得られます。

0  
0  
It IS a number  
enigma2 is not running  
minisatip is already running  

次の3行が実行されるのはなぜですか?

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

$ENIGMA_PID変数の値がゼロであると正しく報告されますが、
2番目のスクリプトでは同じ3行が変数$ENIGMA_PIDの値が2であると報告しますか?

修正する

以下のコメントの質問に対する回答は次のとおりです。

このスクリーンショットは、両方のスクリプトを実行する様子を示しています。 minisatip プロセスが実行中で、enigma2 プロセスが実行されないたびに。

ここに画像の説明を入力してください。

最初のスクリプトのパス(3〜4行のみ)は/home/root/test.shです。どこでも実行でき、次のようになります。# test.sh
2番目のスクリプトのパスは/usr/bin/enigma2.shです。わかりました、私はこのように動作します。enigma2.sh

提案されているように、両方のスクリプトを更新して、パイプラインコマンドからwcとawkを削除しました。このコマンドの出力は、変数に値を割り当てるためのものです。ENIGMA_PID

/home/root/test.shを次のように変更しました。

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

/usr/bin/enigma2.sh でスクリプトの上部に次の行を追加しました。

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

# Check if the no_enigma file exists
...
....

スクリプトを実行すると、このスクリーンショットに出力が表示されます。

ここに画像の説明を入力してください。

私がチェックしているプロセスは、パスが/ usr / bin / enigma2のバイナリファイルです。バイナリが実行されていません。ただし、enigma2.shスクリプトを実行すると、2つのプロセスIDがあります。スクリプト自体がenigma2と呼ばれるためですか?それでは、2つのプロセスIDが1つではなくenigma2と呼ばれるのはなぜですか?

質問
このコマンドで何を変更する必要がありますか?
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')

.../usr/bin/enigma2.sh というスクリプト内にあるとき...
だから、スクリプトを計算せずに実行中のプロセスの一部ですか?
...バイナリ/usr/bin/enigma2が実行されていない場合、結果は0でなければなりません。

ありがとうございます!

柔軟

ベストアンサー1

編集内容を見ると、2番目のスクリプトがであることは明らかであり、コマンドラインに書き込んで呼び出しますenigma2.shenigma2.shスクリプトはパスのどこかにあります(スクリプトはPATH変数にあると/usr/bin/enigma2.sh仮定します)。/usr/binシェルが見つけることができるスクリプト(PATH内)とスクリプトの最初の行を組み合わせると、カーネルはコマンドラインを#!/bin/sh使用して新しいプロセスを開始します。

/bin/sh enigma2.sh

次のようにスクリプトの最初の行を設定すると、これを確認できます。

#!/bin/sh 
ps ax|grep enigma2
exit 0
...

スクリプトを削除する必要はありません。上記の行をスクリプトの先頭に配置し、残りのすべてを下に保つだけです。

以下を取得するには実行してください。

$ enigma2.sh
 3109 pts/6    S+     0:00 /bin/sh enigma2.sh
 3111 pts/6    S+     0:00 grep enigma2

単語を含む2つのプロセスがありますenigma2

これは問題の一部を説明します。スクリプトを次のように変更した場合:

#!/bin/sh 
enigma_pid=$(ps ax|grep enigma2)
echo "$enigma_pid"
exit 0
...                     # leave the old script below (no need to erase it).

そして実行してください:

$ enigma2.sh
 3509 pts/6    S+     0:00 /bin/sh ./enigma2.sh
 3510 pts/6    S+     0:00 /bin/sh ./enigma2.sh
 3512 pts/6    S+     0:00 grep enigma2

これを使用すると、追加の$(…)プロセスが表示されます。

grepプロセスを削除し、grep -v grep2つのプロセスを残しました。

これはあなたが得る番号です2

ノート処置: 大文字の変数名を使用しないでください。この名前は環境変数用に予約されています。ENIGMA_PIDを
使用しないでください

解決策

  • まず、名前でプロセスを識別するために、他のプログラムやスクリプトでまったく同じ名前を使用しないでください。このスクリプトを呼び出すことができますenigma33.sh

  • 2番目:この場合、grepが.で終わる名前と一致するように制限できます2。スクリプトは次に終了し、.sh計算されません。使用

     grep '[e]nigma2$'
    

そして必要なのは一致する行の数だけなので ( -c) を使います。

enigma_pid=$(ps ax | grep -c '[e]nigma2$')

grep -v grepはい、正規表現は[e]nigma2$(文字列として)と同じではないため、必要ありませんenigma2

編集されたスクリプト:

#!/bin/sh


# Detect If enigma2 is running.
enigma_pid=$(ps ax|grep -c '[e]nigma2$')
echo "$enigma_pid"    

# Deetct if minisatip is running.
mini_pid=$(ps ax|grep -c '[m]inisatip$' )


# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
    if [ -z "${enigma_pid##*[!0-9]*}" ] ; then
       echo "error: Not a number" >&2; exit 1
    else
        echo "It IS a number"
    fi
    
    if [ "$enigma_pid" -gt 0 ]; then
        echo "$enigma_pid"
        echo "enigma2 is running"
        killall -r '[e]nigma2$'           # make killing more restrictive
    else
        echo "enigma2 is not running"
    fi
    # Check if minisatip is running already, if not then start it
    if [ "$mini_pid" -gt 0 ]; then
        echo "minisatip is already running"
    else
        echo "minisatip is not running"
        echo "starting minisatip"
        /usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html       
    fi
else    
    # The no_enigma file does not exist
    # Check if minisatip is running, if yes then kill it
    if [ "$mini_pid" -gt 0 ]; then
        echo "minisatip is running, killing it now"
        killall minisatip
    else
        echo "minisatip is not running"
    fi  
    # Check if enigma2 is running already, if not then start it
    if [ "$enigma_pid" -gt 0 ]; then
        echo "enigma2 is already running"
    else
        echo "enigma2 is not running"
        echo "starting enigma2"
        /home/root/run_enigma.sh            
    fi
fi

おすすめ記事