Запуск приложения с проверкой наличия соединения с Internet

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

Запуск приложения с проверкой наличия соединения с Internet

Postby -=A=- » Fri, 04 May 2007, 19:02

Уважаемые господа,
помогите с решением задачи(если не затруднит полный скрипт).

Нужно:

п.1/Раз в 5 минут проверять наличие подключения к инету(достоверно)
п.2/далее, если подключения нет, проверять не запущено ли приложение myfile.exe
п.3/если приложение запущено, то прибивать его и делать рефреш его иконки в трее, что бы не оставался фантом, далее ничего не делать до следующего запуска скрипта
п.4/если подключение к инету есть(например проверяем наличие файла на нужном фтп), то делать п.2 и если приложение не запущено, то запускать его, далее ничего не делать до следующего запуска скрипта
п.5/если подключение есть и приложение запущено, то далее ничего не делать до следующего запуска скрипта

Заранее всем спасибо!
Last edited by -=A=- on Sat, 05 May 2007, 01:13, edited 1 time in total.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby -=A=- » Fri, 04 May 2007, 23:10

Вот, сделал так:

Code: Select all
#( ONLINE
NoLog
AsLoggedUser
: Watch-ONLINE
300000 PAUSE
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT
OR OR AND
 IF
 START-APP: C:\Program Files\MyProgram\MyFile.exe
 ELSE
 KILL: "MyFile.exe"
 TRAY-REFRESH THEN
 RECURSE
;
Action:
Watch-ONLINE
)#


Вроде работает, но полной уверенности в том, что всё верно нет. Например думаю, а не будет ли правильнее заменить кусок:

Code: Select all
 RECURSE
;
Action:
Watch-ONLINE
)#

просто на:

Code: Select all
REPEAT
)#

И ещё есть сомнения, нужно, что бы скрипт не отрабатывался до того, как залогинится какой-либо пользователь. И хотя "AsLoggedUser" и добавлено, не попытается ли скрипт отработать на уровне системы, при условии, что инет подключен постоянно?
Поправьте пожалуйста, если не верно или можно сделать лучше.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby ANR Daemon » Sat, 05 May 2007, 11:04

-=A=- wrote:И ещё есть сомнения, нужно, что бы скрипт не отрабатывался до того, как залогинится какой-либо пользователь. И хотя "AsLoggedUser" и добавлено, не попытается ли скрипт отработать на уровне системы, при условии, что инет подключен постоянно?
Поправьте пожалуйста, если не верно или можно сделать лучше.


В Windows всегда есть LoggedUser.
Так что да, скрипт всегда отрабатывается. (проверено на собственном опыте)
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Postby -=A=- » Sun, 06 May 2007, 22:10

Вот это и не совсем гуд, ибо не редки ситуации, когда юзер комп включил, загрузки не дожидается, естественно и не логинится и отправляется чай пить. При этом подключение к инету у него постоянное, сервис nnCron-а естественно в беграунде стартует и начинает отрабатывать кронтаб, доходит и до этого скрипта.

Вот вопрос, с правами какого "LoggedUser" в этом случае отработается скрипт или он не станет отрабатывать?

Привязывать к конкретному юзеру тоже нельзя, нужно универсальное решение. В принципе можно конечно добавить дополнительную проверку на какой-нибудь процес, который стартует только после логина юзера, но как-то не очень красиво, хотя и работоспсобно будет.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby VoidVolker » Sun, 06 May 2007, 22:19

AsLoggedUser переводится "Как Залогиневшийся Пользователь".
WatchLogon: "*" срабатывает при входе любого пользователя.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby -=A=- » Mon, 07 May 2007, 01:11

Т.е., если я верно понял, конструкция должна выглядить так:

Code: Select all
#( ONLINE
NoLog
WatchLogon: "*"
: Watch-ONLINE
300000 PAUSE
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT
OR OR AND
 IF
 START-APP: C:\Program Files\MyProgram\MyFile.exe
 ELSE
 KILL: "MyFile.exe"
 TRAY-REFRESH THEN
 RECURSE
;
Action:
Watch-ONLINE
)#


Верно? В этом случае nnCron будет ждать пока какой-либо юзер не залогинется и только потом скрипт начнет цикл?
Или нужно поставить и то и то:

Code: Select all
WatchLogon: "*"
AsLoggedUser


Тогда будет ждать логона любого юзера и уже под ним запустит скрипт?

Я полистал хелп, почитал по "WatchLogon", но не смог понять, как будет себя вести скрипт дальше. Не ясно, запустится ли скрипт в цикл повторения или отработает один раз после входа юзера и будет ждать следующего логона?
По задумке, должно быть сначала ожидание логина любого пользователя, а дальше циклический запуск скрипта через каждые 5 минут уже под этим самым залогиневшимся юзером.
У меня тут возникли сомнения в верности вообще конструкции в целом, где-то я что-то не верно написал и вот почему мне так кажется.
Я тут добавил в конструкцию:
HINT: "Программа запущена"

Получилось:

Code: Select all
#( ONLINE
NoLog 
AsLoggedUser
: Watch-ONLINE
300000 PAUSE
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT
OR OR AND
 IF
 START-APP: C:\Program Files\MyProgram\MyFile.exe
 HINT: "Программа запущена"
 ELSE
 KILL: "MyFile.exe"
 TRAY-REFRESH THEN
 RECURSE
;
Action:
Watch-ONLINE
)#


и получилась странная штука. Всё вроде работает как нужно, при наличии инета софтинка стартует, при отрубании убивается, но вот сообщение "Программа запущена" вылетает не один раз после старта софтинки, а циклически и постоянно. И что самое интересное даже не раз в 5 минут, как указано в паузе для скрипта, а чуть ли не раз в каждые 20-30 секунд. Такое ощущение, что скрипт запущен в непрерывном цикле и без пауз.
Выпрямите руки пожалуйста(не дверью и не молотком :D )
Нужно, что бы на начальном этапе обязательно соблюдались все правила ожидание логона любого юзера, далее, после логона циклический запуск скрипта раз в 5 минут под залогинившимся юзером, доступность любого из указанных хостов и обязательное условие, что бы заданная программа не была в данный момент запущена. Далее, если все условия соблюдены, стартует программа и появляется сообщение "Программа запущена" (один раз только при старте программы). Если условия не соблюдены и программа запущена, то программу прибиваем и рефрешим трей, если не соблюдены и программа не запущена ничего не делаем и снова стартуем скрипт через заданную паузу. Подскажите, что не верно в моем варианте и/или чего не хватает?
Заранее большое спасибо.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby ANR Daemon » Mon, 07 May 2007, 02:53

-=A=- wrote:Вот это и не совсем гуд, ибо не редки ситуации, когда юзер комп включил, загрузки не дожидается, естественно и не логинится и отправляется чай пить. При этом подключение к инету у него постоянное, сервис nnCron-а естественно в беграунде стартует и начинает отрабатывать кронтаб, доходит и до этого скрипта.


Ну и что?

Вот вопрос, с правами какого "LoggedUser" в этом случае отработается скрипт или он не станет отрабатывать?


.DEFAULT

Хотя это не имеет никакого значения абсолютно.

Привязывать к конкретному юзеру тоже нельзя, нужно универсальное решение.


Это и есть универсальное решение.

В принципе можно конечно добавить дополнительную проверку на какой-нибудь процес, который стартует только после логина юзера, но как-то не очень красиво, хотя и работоспсобно будет.


Объясни - на[зачем] городить огород, если в нем ничего не растет?
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Postby -=A=- » Mon, 07 May 2007, 19:01

Ну и что?


То, что стартует не понятно под кем.

.DEFAULT


А вот это вовсе не нужно.

Хотя это не имеет никакого значения абсолютно.

имеет, так как стартуемая софтина берет настройки из инишника под каждого из залогиневшихся на этой машине юзера и соответственно стартует с его реквизитами и настройками. А с учетом того, что машин более сотни, они не доменные и на части из них не по одному ине по два юзера, думаю понятно, что вполне понятно, что настраивать на каждой машине под каждого юзера не реально.

Это и есть универсальное решение.


Нет, это не решение, всё было бы так просто, если бы не то, о чем я пишу выше.

Объясни - на[зачем] городить огород, если в нем ничего не растет

В нем как раз и растет, в каждом персональном юзерском огороде свои овощи и чужим не место в чужом огороде.

Если бы мне требовалось просто стартануть софтину или просто стартануть её под любым пользователем, то я бы тут вопросов не задавал, хватило бы стандартных гуишных функций крона, но не хватает стандартных, нужно решение немного сложнее, а как его реализовать грамотно, я пока не могу разобраться точно. Кроме того, есть и дополнительные пожелания, которые тоже реализовать не получается(HINT) в том виде, в котором требуется. Вот и прошу помоч.
Что бы было проще и понятнее, речь идет о ComAgent (модуль MDaemon), думаю, если сталкиваться приходилось, то и вопросы отпадут.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby elos » Tue, 08 May 2007, 07:17

Если эта та задача, что мне рассказывали(спутниковый free-канал и резервный платный - надо исключить работу программы при переходе на платный резервный канал), то я бы сделал так (но точных условий я так и не узнал)

Code: Select all
#( Satellite_Online
NoLog
\ User: john SecPasword: "hLK4h8i0hrV=" \ Logon***** тип логона \ для авторизации при отсутствии пользователя за машиной
\ AsLoggedUser  \ при автологине
\ SingleInstance \ одна копия, если надо - здесь вряд ли
Time: */5  * * * * * \ каждые 5 минут
Rule: HOST-EXIST: "www.rambler.ru" HOST-EXIST: "www.google.com" OR HOST-EXIST: "www.ya.ru" OR PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT AND
Action:
\ ShowMinimized NormalPriority
START-APP: C:\Program Files\MyProgram\MyFile.exe
)#

#( Satellite_Disconnect
AsLoggedUser
WatchDisconnect
Action:
BEEP: 1000 1000
THINT: "Отключился интернет!" 10
\ KILL: "MyFile.exe" \под XP лучше taskkill с прибиванием дочерних процессов
START-APPW: taskkill.exe /IM MyFile.exe /F /T
TRAY-REFRESH
)#


НЕ ПРОВЕРЯЛ!
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Postby -=A=- » Tue, 08 May 2007, 12:30

Это не та задача, о которой Вам говорили, но спасибо всё равно.
К сожалению решение не совсем подходит по уже указанной ранее причине. Софтина стартует исходя из залогиневшегося пользователя, у каждого из которых свой инишник, хранящийся в личном профайле юзера. Кто и когда зайдет не известно, по этому крон по задумке должен ждать логона любого пользователя, а уже потом только под этим залогинившимся юзером запускать в цикл скрипт и соответственно программу тоже. Если софтина стартанет под дефаулт юзером, она в лучшем случае просто откроет окно с пустыми настройками, а обычно она просто висит в процессах даже не отображая GUI, что ещё хуже, так как что бы перезапустить её вручную под этим юзером, нужно будет сначала прибить руками процес, а объяснять это каждому нереально. Ну и опять же подключение к инету у всех разное, как следствие мониторить конкретное подключение тоже нельзя, только доступность хостов.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby -=A=- » Tue, 08 May 2007, 13:17

Не знаю пока, верное ли направление, но думаю можно сделать так:
1. скрипт ожидающий логона любого пользователя и после логона создающий маркерный файл.
2. скрипт проверяющий наличие маркерного файла, при его наличии(значит логон осуществлен) файл удаляющий и запускающий отдельным потоком уже последний скрипт.
3. последний скрипт уже под AsLoggedUser-ом запускается в цикл проверяет инет ну тд., как выше уже писали.
бррррр.....мозг приближается к точке кипения :rolleyes:
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby -=A=- » Tue, 08 May 2007, 17:11

Вот что вышло в результате изысканий:

Code: Select all
#( MyProgram_ONLINE
NoActive /выставил что бы не стартовала самостоятельно
NoLog
AsLoggedUser /будет запускаться под залогинившимся юзером
: Watch-ONLINE
300000 PAUSE
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT
OR OR AND
IF
START-APP: C:\Program Files\MyProgram\MyFile.exe   
ELSE
START-APPW: taskkill.exe /IM "MyFile.exe" /F /T
TRAY-REFRESH THEN
RECURSE
;
Action:
Watch-ONLINE
)#

#( Log_on_user
NoLog
WatchLogon: "*" /дожидается логона любого юзера
Action:
FILE-CREATE: "C:\Program Files\nnCron\logon.txt" /создает маркерный файл
FILE-WRITE: "C:\Program Files\nnCron\logon.txt" "%USERNAME% Log ON" /вписывает в созданый маркерный файл имя юзера
)#

#( Log_on_test
NoLog
Rule: FILE-EXIST: "C:\Program Files\nnCron\logon.txt" /проверяет наличие маркерного файла
Action:
 FILE-DELETE: "C:\Program Files\nnCron\logon.txt" /удаляет маркерный файл
 MyProgram_ONLINE LAUNCH /запускает первый скрипт
)#


Теперь вроде бы всё работает так, как задумано, т.е. софтина стартует только при условии, что юзер залогинился и уже под этим юзером, иначе нет. Поправьте, если что-то не так.
У меня есть сомнения в верности применения "OR" и "AND" в скрипте и не совсем понятно действие "RECURSE", соблюдается ли при применении заданная пауза. Может быть нужно применять "REPEAT"?
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby -=A=- » Thu, 17 May 2007, 20:50

:roll: и опять что-то не совсем так, вроде работает, отключаешь инет, прогу прибивает, но TRAY-REFRESH продолжает циклически отрабатываться. Подскажите, где ошибка. Нужно что бы прибивание процеса(кстати, как его запустить в скрытом окне?) срабатывало при отсутствии инета и при запущенной проге, но один раз, а не циклилось. Прибило прогу, а дальше не повторяется, если условия отключенный инет и запущенная прога не повторились.
Сейчас скрипт работает как задумывалось, но вот прибивание и рефреш отрабатывают в цикле постоянно вне зависимости от того, запущена прога или нет.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Postby makrus » Fri, 18 May 2007, 08:25

-=A=-
1. Ты коменты добавляешь в ответе для форума? А в оригинальном коде их нет?
В Форте все слова должны отделяться пробелом. Выкладывай, пожалуйста, свои задачи без правки, как есть, так исключается появление новых и исправление старых ошибок в выкладываемом (но не проверенном) коде.

2.
У меня есть сомнения в верности применения "OR" и "AND" в скрипте ...

Если я правильно понял чего ты добиваешься, то твои сомнения имеют под собой основания, надо так:
Code: Select all
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" NOT
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
OR OR AND

если хочешь разобраться, то см. "Help --> Работа с программой --> Задача -->Условия запуска задачи (Rule)" и там последний пример.

3. Вместо
Code: Select all
Rule: FILE-EXIST: "C:\Program Files\nnCron\logon.txt" /проверяет наличие маркерного файла

целесообразнее использовать WatchFile:

4. Так же, было бы более "красиво" и правильно использовать вместо существующего кода следующий
Code: Select all
: Inet?  ( -- ? ) \ этот код вставляем в шапку задачи
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
OR OR
;

PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" 0=
IF
  Inet? \ есть Инет, но нет программы
  IF
    START-APP: C:\Program Files\MyProgram\MyFile.exe   
  THEN
ELSE
  Inet? 0= \ нет Инета, но есть программа
  IF
    START-APPW: taskkill.exe /IM "MyFile.exe" /F /T
    PAUSE: 1000 TRAY-REFRESH
  THEN
THEN


5. Задачи Log_on_user и Log_on_test, IMHO, лучше объединить в одну

6. Просто интересно, а для чего?
/вписывает в созданый маркерный файл имя юзера


7. Пожалуй не стоит создавать слово Watch-ONLINE, а код перенести в тело задачи

8. Если есть возможность обойтись без рекурсии, то надо пользоваться этой возможностью. Используй любой цикл без счетчика.

9.
кстати, как его запустить в скрытом окне?
см. SWHide

10. Проверь будет ли правильно работать следующая задача?
Code: Select all
#( MyProgram_ONLINE
Time: */5
NoLog
AsLoggedUser
: Inet?  ( -- ? )
HOST-EXIST: "www.rambler.ru"
HOST-EXIST: "www.google.com"
HOST-EXIST: "www.ya.ru"
OR OR
;
Rule: USERNAME S" SYSTEM" COMPARE 0=
Action:
PROC-EXIST: "C:\Program Files\MyProgram\MyFile.exe" 0=
IF
  Inet? \ есть Инет, но нет программы
  IF
    START-APP: C:\Program Files\MyProgram\MyFile.exe   
  THEN
ELSE
  Inet? 0= \ нет Инета, но есть программа
  IF
    SWHide
    START-APPW: taskkill.exe /IM "MyFile.exe" /F /T
    PAUSE: 1000 TRAY-REFRESH
  THEN
THEN
)#
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Postby -=A=- » Fri, 18 May 2007, 16:47

Спасибо за подробный ответ.

1. При написании руководствовался хелпом:

Code: Select all
\ выражение '(a OR b) AND c' :
a b OR c AND
\ выражение 'a AND b AND c AND NOT d' :
a b AND c AND d NOT AND
\ выражение '(a AND b AND c) OR (d AND (e OR f))' :
a b AND с AND d e f OR AND OR


По этом по логике и написал хост1 или хост 2 или хост3 и софтины нет
если я верно понял хелп, то должно быть как у меня, в твоем варианте, если я верно понимаю получается иначе
проги нет ИЛИ хост1 есть ИЛИ хост2 есть И хост3 есть

2. WatchFile: или FILE-EXIST: в моём случае что-то меняет?

3. про SWHide прочитал, но видно вставлял не так и не туда, попробую иначе.

4. Вот эта часть твоего кода:


Code: Select all
Rule: USERNAME S" SYSTEM" COMPARE 0=


на сколько я понял проверяет, что бы имя юзера отличалось от SYSTEM? Вот это действительно красиво и многое упрощает, спасибо.

5. Код проверю, отпишусь обязательно.
-=A=-
 
Posts: 22
Joined: Fri, 04 May 2007, 18:43

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests

cron