다음과 같은 많은 작업을 수행하는 스크립트가 있습니다.
echo -e " finding mp3 files"
find / *.mp3
Elapsed time: 0
이 작업에 10초가 걸린다고 가정해 보겠습니다.
특정 위치에 복사하는 기능(이것은 실제 스크립트가 아닌 단지 예일 뿐입니다):
echo copying files;
cp *.mp3 /
elapsed time: 6
find
모든 파일을 찾는 동안 실행 시계를 계산하고 표시한 다음 cp
파일이 복사될 때 새 실행 시계를 재설정하고 표시하는 방법이 필요합니다 .
나는 이것을 시도했습니다 :
Timing () {
SECONDS=0; while true do;
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
done &
}
그런 다음 명령을 실행할 때 함수가 호출됩니다.
그러나 시간을 재설정하거나 이 백그라운드 while
루프를 종료할 수 없습니다.
타이밍 기능을 추가하려는 전체 스크립트는 다음과 같습니다.
#!/bin/bash
#--------------------------------------------------------------------------------#
# Modify to Match your Environment #
#--------------------------------------------------------------------------------#
#enter managed servers names STARTING ORDER seperated by 'space'
#COMPNENTS Y or N in CAPS litters
MANAGED_SERVERS_NAMES="WLS_FORMS WLS_REPORTS"
NODEMANAGER_SCRIPT_LOCATION="$WLS_HOME"/server/bin/startNodeManager.sh
DOMAIN_ENV_LOCATION="$DOMAIN_HOME"/bin/setDomainEnv.sh
ADMINSERVER_SCRIPT_LOCATION="$DOMAIN_HOME"/bin/startWebLogic.sh
MANAGED_SERVERS_SCRIP_LOCATION="$DOMAIN_HOME"/bin/startManagedWebLogic.sh
OPMNCTL_COMPONENTS=Y
EMCTL_COMPONENT=Y
################################################################################
#--------------------------------------------------------------------------------#
# This Script Is A CopyRight To KhaLiD Abo EL MaGd #
# Don't Modify Any Thing in This Section #
# #
#--------------------------------------------------------------------------------#
set -e
clear
TFILE=starting.log
debug=$1
if [[ -n "$debug" ]]; then
cat /dev/null > ${TFILE}
gnome-terminal -e "tail -F $TFILE" &
fi
Check_Status_NM ()
{
tail -f ${TFILE} | while read LOGLINE
do
if [[ "${LOGLINE}" == *"Secure socket listener started on port"* ]]
then
echo -e "\e[92mNodeManager Started\e[0m"
pkill -P $$ tail
break
elif [[ "${LOGLINE}" == *"Address already in use"* ]]; then
pkill -P $$ tail
echo -e "Cannot Start NodeManager\nSee ${TFILE} for more info\n "
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" > time
exit 1
nohup kill -9 `ps -ef | grep ${TFILE} | awk '{print $2}'` > /dev/null 2>&1 &
echo "Total Time: $(cat time | paste -sd+ | bc)s"
rm -rf time
fi
done
}
#----------------------------------------------------------------
Check_Status ()
{
sleep 2
tail -F ${TFILE} | while read LOGLINE
do
if [[ "${LOGLINE}" == *"<Server state changed to STANDBY>"* ]]; then
echo -e "\e[94mServer state changed to STANDBY\e[0m"
elif [[ "${LOGLINE}" == *"<Server state changed to >"* ]]; then
echo -e "\e[94mServer state changed to ADMIN\e[0m"
elif [[ "${LOGLINE}" == *"<Server state changed to RESUMING>"* ]]; then
echo -e "\e[94mServer state changed to RESUMING\e[0m"
elif [[ "${LOGLINE}" == *"<Server state changed to STARTING>"* ]]; then
echo -e "\e[94mServer state changed to STARTING\e[0m"
elif [[ "${LOGLINE}" == *"The Network Adapter could not establish the connection"* ]] ; then
echo -e "\e[5m\e[93mWARNING\e[0m Could not establish the connection\n\e[91mCheck Connection to Database\e[0m"
elif [[ "${LOGLINE}" == *"<Server state changed to STARTING>"* ]]; then
echo -e "\e[94mServer state changed to RUNNING\e[0m"
elif [[ "${LOGLINE}" == *"<Server started in RUNNING mode>"* ]] || [[ "${LOGLINE}" == *"<Demo trusted CA certificate is being used in production mode:"* ]];then
echo -e "\e[92mServer Started\e[0m"
pkill -P $$ tail
cat /dev/null > ${TFILE}
break
elif [[ "${LOGLINE}" == *"<Server state changed to FORCE_SHUTTING_DOWN>"* ]]; then
pkill -P $$ tail
echo -e "\e[91mCannot Start Server\e[0m\nSee ${TFILE} for more info\n"
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
nohup kill -9 `ps -ef | grep ${TFILE} | awk '{print $2}'` > /dev/null 2>&1 &
echo "Total Time: $(cat time | paste -sd+ | bc)s"
rm -rf time
exit 1
fi
done
}
#---------------------------------------------------------------------------------------
#Start NodeManager:
SECONDS=0
echo -e "Starting NodeManager..."
nohup "$NODEMANAGER_SCRIPT_LOCATION" > ${TFILE} 2>&1 &
Timing ******************
Check_Status_NM
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
#Start WebLogic AdminServer------------------------------------------------
SECONDS=0
echo -e "Starting AdminServer..."
nohup "$DOMAIN_ENV_LOCATION" > ${TFILE} 2> /dev/null &
Timing ********************
nohup > ${TFILE} "$ADMINSERVER_SCRIPT_LOCATION" 2> /dev/null &
Check_Status
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
#----------- MANAGED SERVERS------------------------------
for i in ${MANAGED_SERVERS_NAMES}
do
SECONDS=0
echo "Starting $i Server..."
nohup ${MANAGED_SERVERS_SCRIP_LOCATION} $i > ${TFILE} 2> /dev/null &
Check_Status
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
done
nohup kill -9 `ps -ef | grep ${TFILE} | awk '{print $2}'` > /dev/null 2>&1 &
#--------------------- OPMNCTL------------------------
if [[ "${OPMNCTL_COMPONENTS}" == *"Y"* ]]; then
SECONDS=0
echo -e "Starting opmn components"
nohup opmnctl startall > /dev/null 2>&1 &
sleep 2
if ( opmnctl status |grep --quiet Init); then
echo -e "\e[94mWaiting For opmn components to Start\e[0m"
opmnctl status |grep -v --quiet Init
opm_pid=$!
while [ -d /proc/$opm_pid ]; do
echo -n "."
sleep 2
done
else
echo -e "\e[92mStarted\e[0m"
fi
opmnctl status | grep -v Alive
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
fi
#---------------------EMCTL-----------------------------------
if [[ "${EMCTL_COMPONENT}" == *"Y"* ]]; then
SECONDS=0
emctl start agent
printf '\e[1;96mElapsed Time: %dm:%ds\e[0m\n' $(($SECONDS%3600/60)) $(($SECONDS%60))
echo ""
echo "$SECONDS" >> time
fi
#-----------------------------------------------------------
TIMEE=$(cat time | paste -sd+ | bc)
echo ""
printf '\e[1;96mTotal Time: %dm:%ds\e[0m\n' $(($TIMEE%3600/60)) $(($TIMEE%60))
cat /dev/null > time
exit 0
기본적으로 답변을 기반으로 이 작업을 수행하여 원하는 것을 얻을 수 있지만 인쇄 서버가 시작된 후 또는 서버 시작에 실패한 후 Check_Status 함수에서 while 루프를 종료하는 방법을 알고 싶습니다.
echo -e "Starting AdminServer..."
nohup "$DOMAIN_ENV_LOCATION" > ${TFILE} 2> /dev/null &
START_TIME=$(date +%s)
nohup > ${TFILE} "$ADMINSERVER_SCRIPT_LOCATION" 2> /dev/null &
Check_Status &
while [[ -d /proc/$! ]]; do
SECONDS=$(( $(date +%s)-START_TIME ))
printf "\e[1;96mElapsed Time: %02dm:%02ds\e[0m\r" $(($SECONDS%3600/60)) $(($SECONDS%60))
done
printf "\e[1;96mElapsed Time: %dm:%ds\e[0m\n" $(($SECONDS%3600/60)) $(($SECONDS%60))
echo "$SECONDS" >> time
답변1
완료하는 데 걸린 시간이 표시됩니다.
#! /bin/bash
START_TIME=$(date +%s)
echo -n Finding mp3 files
sleep 3 # some time consuming command
echo .\ Elapsed time: $(( $(date +%s)-START_TIME ))
다음과 같이 응답합니다.
Finding mp3 files
그런 다음
Finding mp3 files. Elapsed time: 3
기다리는 동안 시간 수를 확인하려면 시간이 많이 걸리는 명령이 (물론) 아무 것도 표시해서는 안 됩니다.
#! /bin/bash
START_TIME=$( date +%s )
echo Finding mp3 files
sleep 3 & # some time consuming command
while [[ -d /proc/$! ]]; do
echo -en \\rElapsed time: $(( $(date +%s)-START_TIME ))
sleep 0.1
done
echo .
설명: 명령이 백그라운드로 전환되면 의 &
프로세스 ID 번호가 유지됩니다 $!
. 이 프로세스는 의 (가상) 디렉터리로 표시됩니다 /proc/$!
. 이 디렉터리가 존재하는 한 명령이 실행되고 시간을 측정합니다.
세 번째 예는 이 질문과 비슷합니다. sleep 3
시간이 많이 걸리는 명령으로 대체되었습니다 .
#! /bin/bash
echo "Starting NodeManager..."
START_TIME=$(date +%s)
nohup sleep 3 &
while ps -p $! > /dev/null ; do
SECONDS=$(( $(date +%s)-START_TIME ))
printf "\r\e[1;96mElapsed Time: %02dm:%02ds\e[0m" $(($SECONDS%3600/60)) $(($SECONDS%60))
done
Echo
편집: 이제 세 번째 예는 다음과 같습니다.올바른 방법프로세스가 아직 실행 중인지 테스트합니다. (그러나 프로세스를 시작해야 하므로 ps
속도가 느려집니다 - 선택)
답변2
당신은 그것을 사용할 수 있습니다pv
:
sleep 10 | pv -t
find / -name '*.mp3' | pv -t
pv
stderr에 타이밍 정보를 쓰는 유사한 패스 cat
(가능한 경우 시스템 호출을 사용하기 때문에 때로는 훨씬 더 효율적임 )입니다.splice()
Elapsed time:
또한 표시하려는 경우:
pv -N 'Elapsed time' -t
또는 (최신 버전 사용):
pv -F 'Elapsed time: %t'
zsh
, ksh
또는 를 사용하는 경우 모니터링 중인 명령의 종료 상태를 잃지 않도록 bash
이 옵션을 설정할 수 있습니다 .pipefail
timewatch() (
set -o pipefail
"$@" | pv -tN 'Elapsed time'
)
timewatch find / -name '*.mp3' || handle_error