Не срабатывает по тайм-ауту пинга

Обсуждение программ nnCron и nnCron LITE

Не срабатывает по тайм-ауту пинга

Postby GREYWOLF2 » Thu, 21 Sep 2006, 10:13

Существует данный скрипт, выполнение его подразумевает запуск программы при превышении тайм-аута пинга в 300 мск (то есть при загрузке канала), и не должен срабатывать когда значение пинга меньше 300 мск. Программа запускается всегда, и когда пинг меньше 300 и когда больше 300. В чем грабли?
Action:
300 TO PING-TIMEOUT
Rule: HOST-EXIST: "login.skydsl.de" NOT
StartIn: "C:\Program Files\TELES\skyDSL"
ShowNormal NormalPriority
QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe
GREYWOLF2
 
Posts: 4
Joined: Thu, 21 Sep 2006, 10:07

Postby Nicholas_Nemtsev » Thu, 21 Sep 2006, 11:24

Думаю, задача должна выглядеть примерно так:
Code: Select all
300 TO PING-TIMEOUT
Rule: HOST-EXIST: "login.skydsl.de" 0= ;
Action:
StartIn: "C:\Program Files\TELES\skyDSL"
ShowNormal NormalPriority
QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe

Rule: после Action: - странный способ задать условие. Если непременно хочется менять таймаут во время выполнения задачи, а не во время компиляции кронтаба, то для проверки условия надо пользоваться IF ... THEN
Code: Select all
Action:
300 TO PING-TIMEOUT
HOST-EXIST: "login.skydsl.de" 0=
IF
   StartIn: "C:\Program Files\TELES\skyDSL"
   ShowNormal NormalPriority
   QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe
THEN
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby GREYWOLF2 » Thu, 21 Sep 2006, 12:06

Rule: после Action: - странный способ задать условие

читал на форуме что так можно делать если вручную проверять запуск скрипта (иначе отбрасываются условия)
300 TO PING-TIMEOUT
Rule: HOST-EXIST: "login.skydsl.de" 0= ;
Action:
StartIn: "C:\Program Files\TELES\skyDSL"
ShowNormal NormalPriority
QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe

0= ; (это означает "не" выполнение условия тайм-аута?)

скрипт не работает, пробовал оба варианта :cry:

Уточню задачу:
Задача каждую минуту поверять пинг по длительности и если превышает определенное значение (300 мск) - запускать программу, в противном случае (то есть пинг меньше 300 мск) не запускать.
GREYWOLF2
 
Posts: 4
Joined: Thu, 21 Sep 2006, 10:07

Postby Nicholas_Nemtsev » Thu, 21 Sep 2006, 14:16

Такое впечатление, что от того таймаута нужно вычесть ещё какую-то дельту для того, чтобы он реально работал. Вот наборчик слов для данного случая. PING2 пингует всего один раз, но вместо флага (или количества прошедших пингов) возвращается время ответа (из RTTime ответа). Пользуйся на здоровье.
Code: Select all
#( ping2-test
NoActive
: ping2 ( a u -- ?)
    { \ ip h ipi req echo -- ?}
    GetHostIP THROW TO ip
    IcmpCreateFile DUP INVALID_HANDLE_VALUE =
    IF DROP
        GetLastError THROW
    THEN
    TO h
    /IPINFO TEMP-ALLOC TO ipi
    /ICMPECHO PING-BUF-LEN + TEMP-ALLOC TO echo
    PING-BUF-LEN TEMP-ALLOC TO req
    PING-TTL ipi ipTtl C!
    PING-TTL ipi ipTos C!
   
    PING-LEN 0 DO I 32 + req I + C! LOOP
   
    -1 TO PING-RES
       PING-TIMEOUT PING-BUF-LEN echo
       ipi
       PING-LEN  req
       ip  h IcmpSendEcho
       IF
          echo icmpStatus @ DUP TO PING-RES 0=
          IF
              h IcmpCloseHandle DROP
              echo icmpRTTime @
              EXIT
          THEN
       THEN
    h IcmpCloseHandle DROP
    FALSE
;
: (PING2) ( addr u -- ?)
    WITH Socket
         ?INIT
         ['] ping2 CATCH
         ?CLEAN
     ENDWITH
     THROW
;

: PING2 ['] (PING2) CATCH ?DUP
    IF 2DROP DROP 0 THEN ;

Action:
  10 0 DO
        S" www.nncron.ru" PING2 .
  LOOP
  CR
)#

Да, вместо слова PING-TIMEOUT можно поставить желаемые мс ожидания ответа, но вообще лучше поставить побольше, чтобы дождаться реального времени пинга.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby GREYWOLF2 » Thu, 21 Sep 2006, 14:58

Прошу прощения за непонятливость
я правильно отредактировал скрипт под себя?

#( ping2-test
: ping2 ( a u -- ?)
{ \ ip h ipi req echo -- ?}
GetHostIP THROW TO ip
IcmpCreateFile DUP INVALID_HANDLE_VALUE =
IF DROP
GetLastError THROW
THEN
TO h
/IPINFO TEMP-ALLOC TO ipi
/ICMPECHO PING-BUF-LEN + TEMP-ALLOC TO echo
PING-BUF-LEN TEMP-ALLOC TO req
PING-TTL ipi ipTtl C!
PING-TTL ipi ipTos C!

PING-LEN 0 DO I 32 + req I + C! LOOP

-1 TO PING-RES
300 PING-BUF-LEN echo
ipi
PING-LEN req
ip h IcmpSendEcho
IF
echo icmpStatus @ DUP TO PING-RES 0=
IF
h IcmpCloseHandle DROP
echo icmpRTTime @
EXIT
THEN
THEN
h IcmpCloseHandle DROP
FALSE
;
: (PING2) ( addr u -- ?)
WITH Socket
?INIT
['] ping2 CATCH
?CLEAN
ENDWITH
THROW
;

: PING2 ['] (PING2) CATCH ?DUP
IF 2DROP DROP 0 THEN ;

Action:
10 0 DO
S" login.skydsl.de" PING2 .
LOOP
CR
StartIn: "C:\Program Files\TELES\skyDSL"
ShowNormal NormalPriority
QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe
)#
GREYWOLF2
 
Posts: 4
Joined: Thu, 21 Sep 2006, 10:07

Postby Nicholas_Nemtsev » Thu, 21 Sep 2006, 15:09

Случай оказался тяжелее, чем я думал :)
Нет. Всё неправильно.
PING2 возвращает время ответа в мс. Как с ним поступить и что сделать, уже зависит от тебя. Можно раз пингануть и этим удволетвориться, можно пингануть N раз и вычислить среднее время ответа. В общем, простор для творчества большой. Для одного раза будет выглядеть так:
Code: Select all
...
Action:
   S" login.skydsl.de" PING2 DUP 0= SWAP 300 > OR
   IF
        StartIn: "C:\Program Files\TELES\skyDSL"
        ShowNormal NormalPriority
        QSTART-APP: C:\Program Files\TELES\skyDSL\sky2sky.exe
   THEN
)#

Кстати слово . (точка) выводит число со стека на консоль (в общем случае), а в данном в файл nncron.out. Так что твой скрипт (без всяких StartIn: и т.д.) выведет в nncron.out реальные времена пингов.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby GREYWOLF2 » Thu, 21 Sep 2006, 15:35

Большое спасибо! Все замечательно работает!
GREYWOLF2
 
Posts: 4
Joined: Thu, 21 Sep 2006, 10:07

Re: Не срабатывает по тайм-ауту пинга

Postby Morituruz » Sat, 02 Jan 2010, 05:36

Как я понял, в случае невозврата пакета PING2 возвращает 0?
Значит потери к блискорасположенным хостам не посчитать?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Не срабатывает по тайм-ауту пинга

Postby Morituruz » Tue, 23 Aug 2011, 13:58

up!
Помимо того, что хочется внятно получать информацию, что пинг так и не вернулся, так же ещё хочется задавать время таймаута, после которого хост считается неотвечающим. Может кто поможет?

Для учёта потерь воткнул такой костыль, на большее ума не хватило.
Code: Select all
\ определил переменную, куда откладываются потери
USER-VALUE ping_loss
...
: ping2 ( a u -- ?)
    { \ ip h ipi req echo -- ?}
    GetHostIP THROW TO ip
    IcmpCreateFile DUP INVALID_HANDLE_VALUE =
    IF DROP
        GetLastError THROW
    THEN
    TO h
    /IPINFO TEMP-ALLOC TO ipi
    /ICMPECHO PING-BUF-LEN + TEMP-ALLOC TO echo
    PING-BUF-LEN TEMP-ALLOC TO req
    PING-TTL ipi ipTtl C!
    PING-TTL ipi ipTos C!
   
    PING-LEN 0 DO I 32 + req I + C! LOOP
   
    -1 TO PING-RES
       PING-TIMEOUT PING-BUF-LEN echo
       ipi
       PING-LEN  req
       ip  h IcmpSendEcho
       IF
          echo icmpStatus @ DUP TO PING-RES 0=
          IF
              h IcmpCloseHandle DROP
              echo icmpRTTime @
              EXIT
          THEN
       THEN
    h IcmpCloseHandle DROP
    \ и складываю потери в неё
    ping_loss 1+ TO ping_loss
    FALSE
;


В идеале что-то типо этого
<адрес хоста> <время ожидания ответа в мс> <сколько раз пингуем> PING2 <хост ответил? (да/нет)> <если ответил, то сколько времени прошло, мс>
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 5 guests

cron