システムダウンタイムがしきい値を超えたときにシステムサービスを開始する単純なスクリプトをbashに作成しました。もし部分はデフォルトで整数値(コマンドから抽出)をチェックします。臨界点値(整数)
コントロールはしないだろうもし氏名。誰でも私に上記の解決策を提案できますか? IF文で整数式をテストする方法
#!/bin/bash
**function start_repair {
threshold=120
IP=10.194.51.216
echo "$((systemctl status cassandra | awk'/(Active:failed)/{print$10}')| awk '{print ($0+0)}')"
if [[ "$((systemctl status cassandra | awk '/(Active: failed)/{print $10}') | awk '{print ($0+0)}')" -gt "${threshold}" ]]; then
echo "greater than ${threshold}"
service cassandra restart
PID=$!
wait $PID
echo done
fi }**
間違い: bash: 5行: [: : 整数式が必要
答え1
あなたの質問とあなたの機能にいくつかの問題があります。
まず、[: : integer expression expected
エラーあなたの機能によって生成されません。関数内のテストでは[[ ... -gt ... ]]
このエラーは発生しません(テストのためにコマンドラインで使用されます[[ "hello" -gt "world" ]]
)。このエラーを生成する単一の括弧を使用する別のテストがどこかにあります(コマンドラインで使用してテスト[ "hello" -gt "world" ]
)。[ ... ]
コードの他の場所で算術テストを探します。
bash
エラーメッセージ自体は、この[
ユーティリティがエラーを生成し、算術テストを実行しようとしたターゲットが空の文字列であったことを示しているため、これを確認できます。
print (0+$0)
コメントでコードが機能するように変更したと言われました。ステートメントが同じであるため、この変更がどのような影響を与えるか疑われます。おそらくスクリプトへの入力が変更され、エラーが発生しなかった可能性があります。print 0+$0
awk
その後、in testに変更したとコメントしました-gt
。>
これにより、テストを辞書式文字列ソートテストに変更します。そのようなテストは本物たとえば、左側の文字列が右側の文字列の後に来ると、次のよう20 > 100
になります。本物。
これは、エラーが実際に表示される関数にないことも無視します。
私のアドバイスは、スクリプトを作成してスクリプトを作成するときにスクリプトの各コンポーネントをテストして、スクリプトの各追加が目的のアクションを実行することを確認することです。
機能自体には問題がたくさんあります。
たとえば、変数はプロセスのプロセスIDを保持するPID
必要がありますが、これをバックグラウンドジョブ(コマンドの最後に使用される)として実行しないため、予想されたものとは異なります。そしてその後のプロセスはあなたが待っていると思うプロセスを待ちません。cassandra
cassandra
&
PID
wait $PID
PID
変数と呼び出しによってwait
達成したいことは明確ではありません。私の考えでは、ペアの割り当てPID
とペアの呼び出しを削除できることですwait
。
$(( ... ) | ... )
で書く方が良いです$( ... | ... )
。まず、systemctl | awk
サブシェルで実行するのは不要で、2番目は読み取りが混乱しています$(( ... ))
。山水評価する。
パスワード
awk'/(Active:failed)/ {print $10}' | awk '{print ($0+0)}'
にマージすることができます。
awk'/(Active:failed)/ { print 0+$10 }'