Anonymоus
27-11-2011, 09:49
Подскажите, возможно ли организовать обмен данными между двумя параллельно запущенными скриптами иначе, чем через файл-метки? Для примера, чтобы вопрос был понятнее, приведу код скрипта, в котором это используется - ожидание получения команды (в данном случае это команда на корректное завершение, с записью в лог) от пользователя не тормозит действие выполняющего основную задачу скрипта, как раз потому, что он запущен в двух экземплярах, один из которых и занимается ожиданием команды от пользователя.
Так вот, сейчас все взаимодействие между двумя "потоками" организовано исключительно за счет файлов-меток. Общие переменные отпадают, так как сколько бы не изменял значение переменной процесс-потомок, в процессе-родителе оно останется неизменным. Или может я ошибаюсь, и всё же использовать общие переменные как-то возможно?
@Echo Off
:: v1.5, Anonymous, 2011
:: Скрипт для проверки статуса выбранного IP и создания лога с записями о его смене.
:: Ведение лога
Set Logging=true
:: Таймаут в секундах
Set Timeout=15
:: Упрощенная проверка ответа
:: (меньше нагружает процессор, может давать ложный результат)
Set SimpleCheck=false
:: Звуковая сигнализация при статусе "Online"
Set UseSound=true
:: Диалог ввода адреса или выбора из заранее подготовленных
If "%SelfStart%"=="" (GoTo Launcher)
Cls
Title Ping2Host
Echo.
Echo g - Google public DNS (8.8.8.8)
Echo s - Server (192.168.50.5)
Set /P Host= Enter IP or hostname:^>
If /I "%Host%"=="G" Set Host=8.8.8.8
If /I "%Host%"=="S" Set Host=192.168.50.5
:: Запуск второй копии внутри первой
:: (для организации примитивного управления вторым запущенным процессом)
:Launcher
If "%SelfStart%"=="" (
Set SelfStart=yes
Start /B "" "%~nx0"
GoTo WaitUserCommands
)
:: Подготовка к запуску пингера
Cls&Set Total=0&Set Succes=0&Set Fail=0&Set Status=Not checked yet&Set isReady=0&Set StartTime=[%date% - %time:~-0,8%]
Set /A Sleep=(Timeout-1)*1000
If /I "%SimpleCheck%"=="true" (Set CheckCmd=Ping -n 1 -w 1000 -l 1024 %Host%^>nul) Else (Set CheckCmd=Ping -n 1 -w 1000 -l 1024 %Host%^|Find "TTL="^>nul)
If %Logging%==true (Set LogFile="%~n0.log") Else (Set LogFile=nul)
:: Цикл пингера
Echo.>>%LogFile%&Echo Started at %StartTime%>>%LogFile%
:ShowStats
Call :Stats
.\bin\nc.exe wait %Sleep%
%CheckCmd%
If %ErrorLevel% GTR 0 (
Set /A Fail+=1
If Not "%Status%"=="Offline" (Echo %date% - %time:~-0,8% ^>^> %Host% is offline>>%LogFile%)
Set Status=Offline
Title Offline [%Host%] - Ping2Host
) Else (
Set /A Succes+=1
If Not "%Status%"=="Online" (
Echo %date% - %time:~-0,8% ^>^> %Host% is active>>%LogFile%
If %UseSound%==true (
Start /B .\bin\hs_play.exe .\data\online.wav
)
)
Set Status=Online
Title Online [%Host%] - Ping2Host
)
:: Проверка на запрос завершения работы от первой копии процесса
If Exist stop.flag (
Echo Closed at [%date% - %time:~-0,8%], last status: %Status%>>%LogFile%
Del stop.flag
If Exist ready.flag Del ready.flag
Exit
)
GoTo ShowStats
:: Шаблон окна со статистикой
:Stats
If Exist ready.flag (
Del ready.flag
Set isReady=1
)
Cls
Echo.
Echo Started at: %StartTime%
Echo.
Echo Target: %Host%
Echo Online: %Succes% times, Offline: %Fail% times
Echo Current status: [%date% - %time:~-0,8%] - %Status%
Echo.
If %isReady%==1 (
Echo Press Esc to terminate process
) Else (
Echo.
)
Exit /B
:: Создание флага завершения работы по нажатию выбранной кнопки
:: (при желании избавиться от внешних утилит - заменяется на pause и срабатывает соответственно,
:: от любой кнопки)
:: Создана задержка для невозможности завершения работы сразу после первого цикла
:WaitUserCommands
Set /A ExitDelay=(Timeout*3-1)*1000
.\bin\nc.exe wait %ExitDelay%
Echo.>ready.flag
:: Проверка на код нажатой клавиши
:CheckInput
.\bin\hs_readkey
If %ErrorLevel%==27 (Echo.>stop.flag) Else (GoTo CheckInput)
Exit
Так вот, сейчас все взаимодействие между двумя "потоками" организовано исключительно за счет файлов-меток. Общие переменные отпадают, так как сколько бы не изменял значение переменной процесс-потомок, в процессе-родителе оно останется неизменным. Или может я ошибаюсь, и всё же использовать общие переменные как-то возможно?
@Echo Off
:: v1.5, Anonymous, 2011
:: Скрипт для проверки статуса выбранного IP и создания лога с записями о его смене.
:: Ведение лога
Set Logging=true
:: Таймаут в секундах
Set Timeout=15
:: Упрощенная проверка ответа
:: (меньше нагружает процессор, может давать ложный результат)
Set SimpleCheck=false
:: Звуковая сигнализация при статусе "Online"
Set UseSound=true
:: Диалог ввода адреса или выбора из заранее подготовленных
If "%SelfStart%"=="" (GoTo Launcher)
Cls
Title Ping2Host
Echo.
Echo g - Google public DNS (8.8.8.8)
Echo s - Server (192.168.50.5)
Set /P Host= Enter IP or hostname:^>
If /I "%Host%"=="G" Set Host=8.8.8.8
If /I "%Host%"=="S" Set Host=192.168.50.5
:: Запуск второй копии внутри первой
:: (для организации примитивного управления вторым запущенным процессом)
:Launcher
If "%SelfStart%"=="" (
Set SelfStart=yes
Start /B "" "%~nx0"
GoTo WaitUserCommands
)
:: Подготовка к запуску пингера
Cls&Set Total=0&Set Succes=0&Set Fail=0&Set Status=Not checked yet&Set isReady=0&Set StartTime=[%date% - %time:~-0,8%]
Set /A Sleep=(Timeout-1)*1000
If /I "%SimpleCheck%"=="true" (Set CheckCmd=Ping -n 1 -w 1000 -l 1024 %Host%^>nul) Else (Set CheckCmd=Ping -n 1 -w 1000 -l 1024 %Host%^|Find "TTL="^>nul)
If %Logging%==true (Set LogFile="%~n0.log") Else (Set LogFile=nul)
:: Цикл пингера
Echo.>>%LogFile%&Echo Started at %StartTime%>>%LogFile%
:ShowStats
Call :Stats
.\bin\nc.exe wait %Sleep%
%CheckCmd%
If %ErrorLevel% GTR 0 (
Set /A Fail+=1
If Not "%Status%"=="Offline" (Echo %date% - %time:~-0,8% ^>^> %Host% is offline>>%LogFile%)
Set Status=Offline
Title Offline [%Host%] - Ping2Host
) Else (
Set /A Succes+=1
If Not "%Status%"=="Online" (
Echo %date% - %time:~-0,8% ^>^> %Host% is active>>%LogFile%
If %UseSound%==true (
Start /B .\bin\hs_play.exe .\data\online.wav
)
)
Set Status=Online
Title Online [%Host%] - Ping2Host
)
:: Проверка на запрос завершения работы от первой копии процесса
If Exist stop.flag (
Echo Closed at [%date% - %time:~-0,8%], last status: %Status%>>%LogFile%
Del stop.flag
If Exist ready.flag Del ready.flag
Exit
)
GoTo ShowStats
:: Шаблон окна со статистикой
:Stats
If Exist ready.flag (
Del ready.flag
Set isReady=1
)
Cls
Echo.
Echo Started at: %StartTime%
Echo.
Echo Target: %Host%
Echo Online: %Succes% times, Offline: %Fail% times
Echo Current status: [%date% - %time:~-0,8%] - %Status%
Echo.
If %isReady%==1 (
Echo Press Esc to terminate process
) Else (
Echo.
)
Exit /B
:: Создание флага завершения работы по нажатию выбранной кнопки
:: (при желании избавиться от внешних утилит - заменяется на pause и срабатывает соответственно,
:: от любой кнопки)
:: Создана задержка для невозможности завершения работы сразу после первого цикла
:WaitUserCommands
Set /A ExitDelay=(Timeout*3-1)*1000
.\bin\nc.exe wait %ExitDelay%
Echo.>ready.flag
:: Проверка на код нажатой клавиши
:CheckInput
.\bin\hs_readkey
If %ErrorLevel%==27 (Echo.>stop.flag) Else (GoTo CheckInput)
Exit