「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/sh
2番目のスクリプトの一番上から削除すると、予想される出力が得られます。
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.sh
。enigma2.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 grep
2つのプロセスを残しました。
これはあなたが得る番号です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