2013-07-02 2 views
0

У меня есть сценарий, в котором файл будет поступать в любое время между 11:30 и 11:40. Я могу запланировать запуск сценария в 11:30, чтобы проверить, прибыл ли файл. Вот что я имею со мной.Необходимо, чтобы процесс прерывался в определенное время

i=0 
while [ i -eq 0 ] 
do 
    if [ ! -f $File_Check_Dir/$FILE_NAME ] ; then 
     echo " \n File has arrived at `date +'%d-%m-%Y %H:%M:%S'****" | tee -a ${LOGFILE} 
     i=1 
    fi 
done 

Я могу заставить сценарий работать в фоновом режиме. Но мне нужно будет проверить systime и отправить предупреждение, если файл не прибыл до 11:40 ET. Я пробовал с функциями systime, но не мог получить то, что хотел.

+0

Почему бы не дождаться 11:41 и просто получите файл или сообщите об ошибке? – bitfiddler

+0

Yup. Я хотел бы 1) иметь, какой процесс загружает файл журнала, когда прибытие происходит (если возможно), затем 2) просто запланировать один скрипт в 11:41, чтобы проверить, прибыл он или нет (и отправить электронное письмо или другое предупреждение) – paulsm4

+0

Это не сработает. У меня есть процесс, начинающийся ровно в 11:40, и он начнет обработку и удаление файла из каталога. – Vignesh

ответ

0

Пару предложенных способов сделать это:

  1. При работе в системе с Inotify поддержки, использовать такой инструмент, как inotifywait (из пакета Debian inotify-tools) должны быть немедленно уведомлены об изменениях к вашему наблюдаемому каталогу/файлу. Вы можете использовать опцию -t для тайм-аута, если в течение указанного периода ожидания не происходит никаких действий. Если вы используете этот инструмент, вам, возможно, придется позаботиться о состоянии гонки между проверкой существования вашего файла в вашем сценарии оболочки и выполнением команды inotifywait.

  2. Оберните свой скрипт, используя команду timeout. например. timeout 10m my-watch-script. Если тайм-аут возникает до выхода сценария, то timeout вернет код выхода 124, который затем можно проверить, чтобы определить, произошел ли тайм-аут, или файл был найден.

  3. Если вы используете bash, проверьте встроенную переменную SECONDS как часть вашего условия цикла и выйдите, когда истечет таймер. Если bash недоступен, заменителем будет использование команды date, и она будет выводить формат в секундах. См. this answer.

В его нынешнем виде представленный код работает в очень плотной петле опроса. Было бы неплохо поставить там sleep.

+0

Инструменты inotify недоступны в среде, в которой я работаю, и я использую kshell. Можете ли вы рассказать о команде тайм-аута? Вы хотите использовать, планируя в cron, мне нужно разместить расписание? – Vignesh

+0

@ user2522824 Вы можете поместить команду «timeout» в crontab, но вполне вероятно, что вам понадобится выполнить другое действие, если произойдет таймаут. Если вам нужно предпринять какие-то другие действия, вам лучше всего иметь скрипт-оболочку, выполняемый cron, и внутри оболочки будет вызов 'timeout your-script'. –

+0

Я получил его. Спасибо Austin :) – Vignesh

0

Вы можете получить время с date +"%H:%M", то вы можете добавить еще один «если», чтобы проверить, если это больше, 11:40 и выход после отправки соответствующего уведомления ..

+0

Это намного проще..i = 0 while [i -eq 0] do if [date +% H:% M -eq 11:46] echo "\ n Файл Pearson не прибыл" | tee -a $ {LOGFILE} выход если [!-f $ File_Check_Dir/$ Pearson_DATA_FILE_NAME]; затем echo "\ n Файл прибыл в' date + '% d-% m-% Y% H:% M:% S' **** "| tee -a $ {LOGFILE} i = 1 fi сделано Это нормально? – Vignesh

+0

Выглядит хорошо. Вы пытались запустить его с тестовым файлом? – SidJ

+0

Похоже на дату + «H:% M» не работает в скрипте. Я попытался дать то же самое в командной строке. Он работает тогда. – Vignesh

0

Один из возможных вариантов:

В вашем скрипте:

trap sendMailFunction SIGUSR1 
sendMailFunction(){ 
. 
. # Enter your code here, which will send mail in case the file does not arrive in time 
. 
} 
. 
. # Remainder of the script.... 

& Запуск под timeout в 11:30 (Использование at или cron, как ваше требование.)

timeout -s SIGUSR1 10m /path/to/myscript.sh arg1 arg2 arg3 ... 
+0

Можете ли вы дать мне команду для планирования в cron с параметром тайм-аута? – Vignesh

Смежные вопросы