シェルスクリプトで実行されているプロセスを検出できません。

シェルスクリプトで実行されているプロセスを検出できません。

スクリプト:

#!/bin/bash
kafka=`ps -ef | grep 'kafka' | grep -v grep | wc -l`
echo $kafka
if [ $kafka<3 ]
then
echo "Hi Support Team,

Kafka is down on QA/Dev server $hostname .Please take immediate action

Regards,
Application Support Team"| mailx -s "Kafka down on QA/Dev server" [email protected]
fi

出力:

-bash-4.2$ ./mail.sh
2
./mail.sh: line 4: 3: No such file or directory

ベストアンサー1

引用符のない<演算子は、シェルのリダイレクト演算子です。このエラーは、シェルがというファイルからリダイレクトしようとしていることを示します3。 2つの整数を比較するためにそれを使用したいと思うかもしれません-lt

代替実装は次のとおりです。

#!/bin/sh

if ! pkill -0 kafka; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

pkill上記のスクリプトは、各プロセスに「ゼロシグナル」を送信するために使用されますkafka(コマンド名だけでなく、コマンドライン全体pkill -0 -f kafkaから部分文字列を取得するために使用されます)。kafkaそのようなプロセスがないと、pkillゼロ以外の終了状態で終了し、電子メールの送信がトリガされます。 「ゼロ信号」は、プロセスが存在し、プロセスに何の影響も及ぼさないことをテストするために使用されます。

または、プロセス数を計算kafkaして3つ未満のときに電子メールをトリガーするには、次の手順を実行します。

#!/bin/sh

if [ "$( pgrep kafka | wc -l )" -lt 3 ]; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

このpgrep呼び出しは、指定されたパターンに一致するすべてのプロセス名のプロセスIDを1行に1つずつ印刷します。コマンド名だけでなく、コマンドライン全体から部分文字列を取得pgrep -f kafkaするために使用されます。kafka

上記の両方のスクリプトは変数がhostname設定され、スクリプトの外部にエクスポートされたと仮定します。$(hostname)を使用して、ここで説明されているユーティリティを$hostname呼び出すことができます。hostname

おすすめ記事