実行されていないプロセスのリストをエコーし​​ます。

実行されていないプロセスのリストをエコーし​​ます。

このサーバーで必要なプロセスを開始するためにファイルを参照するスクリプトを開発しました。 180秒後にスクリプトがタイムアウトします。スクリプトの最後で180秒以内に開始されなかったプロセスを表示したいと思います。どうやってこれを達成できますか?

リファレンスドキュメントref.txt:

#TEST:process1
#TEST:process2
TEST:Process3
TEST:process4
TEST:process5

必要なプロセスを開始するスクリプトのコマンドラインは次のとおりです。

grep "TEST:" /products/test/ref.txt | while read LINE (Selects process3,4,5 to start)
do
PROC_NAME=$(echo ${LINE} | awk -F ':' '{print $2}')
echo "Starting the required process"
echo "<command line to start the processes>"
done 

#Giving script 180 seconds to start the processes

(( START_TIME = 0 ))
until [ ${START_TIME} -gt 180 ]
do 
greps for the processes running
echo " N number of processes are running"
<I want to display the processes which have not started here>
done

180秒後にスクリプトがタイムアウトします。

180秒後に開始されなかったプロセスを示すロジックを追加する必要があります。どうすればいいですか?

ベストアンサー1

bashorに似たシェルがあるとしますksh

max_time=3

SECONDS=0

IFS=$'\n:'

grep -v '^#' ref.txt |
while read tag cmd; do
    if (( SECONDS < max_time )); then
        echo "starting '$cmd' (tag is '$tag')"
        sleep 2 # for simulation purposes
    else
        echo "did not have time to start '$cmd' (tag is '$tag')"
    fi
done

これにより、次の出力が提供されます。

$ ksh script.sh
starting 'Process3' (tag is 'TEST')
starting 'process4' (tag is 'TEST')
did not have time to start 'process5' (tag is 'TEST')

スクリプトは、ファイルからref.txtコメントされていないすべての行を選択して分割し、:コマンドから初期マークアップを分離します。

スクリプトがまだタイムアウトしていない場合、現在の読み取りプロセスが開始されます(sleepここでは呼び出しでシミュレートされます)。

時間がかかりすぎると、追加のプロセスは開始されませんが、まだ開始されていないプロセスが報告されます。

タイムアウトは非同期的には発生しません。つまり、スクリプトは数秒以上かかるとプロセスの起動を中断しませんmax_time

このSECONDS変数には、シェルが開始されてからの秒数が含まれます。この場合、最後にゼロに設定されてからの秒数が含まれます。

おすすめ記事