このサーバーで必要なプロセスを開始するためにファイルを参照するスクリプトを開発しました。 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
bash
orに似たシェルがあるとします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
変数には、シェルが開始されてからの秒数が含まれます。この場合、最後にゼロに設定されてからの秒数が含まれます。
答え2
180秒後に開始されなかったプロセスを表示するロジック。シェルが Bourne シェルであると仮定します。私はテストbash
しましたzsh
# ...
# generate a timestamp in seconds since UNIX epoch
START_TIME=$(date '+%s')
until [[ $(date +%s) -gt $((START_TIME + 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
# ...