2015-03-06 3 views
0

Я бегу скрипт, который работает на один или два раза в неделю .. и эта программа работает в течение нескольких часов (зависит от того, как много файлов) в день ..Shell Script Контроль времени

Но проблема в том, Я должен приостановить эту программу в рабочее время. , например, если рабочий час составляет от 1 до 3 часов, тогда вся работа скрипта должна приостановиться и ждать до 3:01 утра, чтобы начать снова. i don ' t должен УБИТЬ текущий текущий процесс, если он работает после 1 часа ночи. , но всякий раз, когда это делается с этим конкретным файлом, я должен сделать паузу для следующих файлов.

в настоящее время это то, что я выяснить

while true 
do 
    curr_time= date +"%H%M%S" 
    if [ $curr_time -ge 005000 -a $curr_time -le 030000 ] 
    then 
     echo "Pause for 12000 seconds" 
     sleep 12000 
    else 
     break; 
    fi 
done 

Так начните паузу в 12:50 вместо того, чтобы надеяться, что все может поэтапно, прежде чем 1am и сна в течение 12000 сек, которая составляет около 3 часов и перезапустить ..

Но проблема в том, что по какой-то причине, когда он просыпается с 12000 секунд сна, и это еще не 3 часа ночи, он будет спать еще 12000 секунд. как я могу обойти это?

Я хочу, чтобы он останавливался около 1 часа ночи (каждый процесс файла занимает около 1 минуты, но несколько сотен и тысяч файлов там обрабатываются) и начинает ПРАВО НАЗАД В 3 часа ночи. Мне не нужно его убивать, если он проходит 1 утра .. просто пауза после того, как файл будет обработан.

+4

Просто используйте меньшее время сна ... каждый раз, когда скрипт просыпается, он проверяет, находится ли он в окне «Не обрабатывать». Если это так, он снова будет спать. –

+1

Почему бы просто не отправить сигнал STOP на его pid в 0:59 и сигнал CONT в 3:01? – technosaurus

+1

FYI, я не думаю, что этот скрипт может работать в текущем состоянии. Строковая переменная 'curr_time' не может быть' -ge 245000' и ​​'-le 030000'. Возможно, вы имели в виду '-ge 005000'? – dg99

ответ

0

Как ваш вопрос помечен bash, вы можете использовать арифметическое расширение, чтобы просто спать необходимое количество секунд.

sleep $(($(date -d 3:01 +%s) - $(date +%s)))

date -d 3:01 +%s не сказывать количество секунд с начала эпохи до 3:01, date +%s количество секунд с начала эпохи до сих пор.

Разница должна быть в количестве секунд, которое вы должны ждать до 3:01.