스크립트가 마일스톤 간격으로 실행되는 동안 스크립트 실행 시간을 모니터링하고 알림을 생성할 수 있는 방법이 있습니까?
AFAICS는 wait
항상 bash에서 차단됩니다.
cron 이메일을 진압하기 위해 STDOUT, STDERR 캡처와 함께 이것을 사용할 계획이지만, 스크립트가 예상 창을 초과하면 (종료하지 않고) 알림을 받고 싶습니다.
Google은 내가 찾고 있는 것이 아닌 time
항목 (추가 논리 없이)을 계속해서 알려줍니다 .timeout
답변1
프로세스를 백그라운드에서 실행하고 다음 루프와 같은 것을 사용하여 모니터링하는 것은 어떻습니까? 이 경우 카운터를 설정할 수도 있으며, 예를 들어 필요한 것보다 3배 더 오래 걸리는 경우 프로세스를 종료할 수 있습니다.
# Interval for checking status
readonly interval=10
# Your task here, maybe with some output redirections
sleep 100 &
# Infinite loop
while true
do
# Chill some time
sleep "$interval"
# Check if the background process still exists
if ps -p "$!" &> /dev/null
then
# Do something here, again maybe with >> logfile
echo "Process is still running!"
fi
done
답변2
이 줄을 스크립트 앞에 두고 조정할 수 있습니다. 작업 실행의 상태가 in_queue
및 와 같이 다른 경우 파일 설명자 started
에 해당 신호를 쓰고 &$fdtick
타이머는 간격을 두고 신호를 반복하고 1분마다 줄 바꿈을 인쇄합니다. 물론 루프에는 다른 감시 기능이 포함될 수도 있습니다.
노트: >( ... )
프로세스 대체라고 하며 bash
실행 중인 프로세스와 새 공동 프로세스 사이에 파이프를 만들고 이름을 지정하는 구문입니다. <( ... )
생성자가 파이프의 읽기 끝을 보유할 때 동일한 작업이 수행됩니다.
############################################################
# VISUAL TIMER #
# >$fdtick : tick input file descriptor #
# >stderr : visual output #
############################################################
exec {fdtick}> >(
((tick = 2, begintime = SECONDS))
while read -t $tick dot || { (( $? > 128)) && dot=${odot:-#}; }; do
odot=$dot
(( lastmin = durationmin, durationtick = (duration = SECONDS - begintime) / tick, durationmin = duration / 60 ))
while (( durationtick > lasttick )) ; do echo -n "$dot " ; ((lasttick++)) ; done
(( durationmin == lastmin )) || echo $durationmin
done >&2
) &&
trap "$(trap -p EXIT)"$'\n'"exec {fdtick}>&-" EXIT
sleep 50 ## long starting step
echo '.'>&$fdtick ## say the script is going on
sleep 50 ## long working step
## terminated, cleanup by trap EXIT