02.04.2009 02:47
Цитата:
OlegON А поподробнее? Каждый грузит в определенное время?
Если особо не вдаваться в подробности, то общая схема выглядит так:

Для выгрузки на ТСД.
Прежде всего, терминальный клиент на сервере запускает ярлычком скрипт, который проверяет наличие флагов выгрузки, созданных другими пользователями. Если флаг обнаружен, то пишется в каком именно магазине выгружают/загружают ТСД. Если чужих флагов нет, создаётся свой. Тем самым, пользователи других магазинов уже не могут зделать выгрузку. Далее, требуется выгрузить данные их СМ в файл. Если пользователь тормозит в течении определённого интервала времени (например, отвлекли), то его флаг автоматически удаляется и, впоследствии, механизм выгрузки требуется запускать снова. После того как выгрузка зделана, скрипт отлавливает этот момент и отправляет уже архивированные данные кусочками в магазин. В завершении происходит удаление соответствующего магазину флага выгрузки.

Для приёма данных с ТСД.
Обратный процесс несколько отличается. Данные из магазина прилетают на сервер (как именно, это отдельная история). Пользователь запускает там ярлычком скрипт, который проверят наличие файла Scanout.dat в папке обмена. Если файл есть, то пользователь курит/пьёт чай. Если файла нет, то происходит извлечение файла из архива и помещение его в папку обмена. Далее, необходимо принять данные в течении определённого интервала времени. Если пользователь тормозит, то файл удаляется, дав тем самым возможность пользователям других магазинов выгрузить ТСД.

На всех этапах схемы обмена происходят всевозможные проверки (архивация, разархивация, отправка, приём, проверка флагов), которые предотвращают различные внештатные ситуации. Но так или иначе, технически от ошибок оператора полностью оградиться не получиться. Так, например, если оператор не запустит скрипт на выгрузку данных на ТСД и тем не менее зделает её из СМ, то вполне возможно что он затрёт чью-то выгрузку, которая была зделана секунду назад. Следовательно, требуется ещё и дрессировать администраторов, чтобы те не нарушали общей схемы.
13.04.2009 16:52
слушайте только что в терминале (было надо с эмулировать ТСД) зафигалил эмулятор.. и выгрузил в него данные...
времени нет разбиратся но может...
Он умеет эмулировать терминал под каждым пользователем в RDP... и собственно проблемы пройдут...


попробывал... не хочет сцук*!... т.е. эмульгатор то с командной строки я запускаю два... а вот ... ActivSync... в разных сесиях не живут.. копаю дальше...
08.06.2009 13:44
В продолжении темы. После долгих плясок с бубном, победить глюк не удалось. Возможности обновиться на более свежую версию СМ не имеется, поэтому пошёл огородами. Была придумана программная реализация некоторого смягчения и даже полной ликвидации проблемы. Напомню, что заключалась она в следующем. Если при работе в СМ не терминальном сервере через мелкомягкий RDP разрывается связь, пусть даже на несколько секунд, нагрузка не процессор возрастает до 50 % на одну сессию. При восстановлении связи, нагрузка не снижается. Помогает только перезагрузка СМ. В условиях плохой связи, разрыв/коннект происходят практически незаметно, вследствии чего, нагрузка на процессор возрастает многократно и нередко достигает 100 %. Используя утилиту nnCron, был написан скрипт. Он отслеживает запуск даже нескольких одновременно запущенных процессво СМ разными пользователя и далее начинает мониторить загрузку процессора каждой отдельной сессией. Если зафиксировано, что нагрузка на процессор в течении определённого времени держится на одном уровне, пользователю, который открыл сессию, отправляется сообщение с предложением сохранить данные и перезагрузить СМ. Если в течении минуты пользователь не зделал этого, отправляется следующее сообщение с предупреждение о закрытии его сессии. Через минуту, если пользователь не снял нагрузку на процессор, выполняется отключение его сессии. Если изначально связь разорвалась и в течении определённого времени не было реконекта, то сессия, также, отваливается. Если кто-то наблюдает у себя похожую проблему, то готов поделиться этим решением. Я польностью его отладил и протестировал, всё отлично работает.
15.03.2010 09:22
Vovantus, поделитесь с сообществом скриптиком если не сложно. Столкнулся с теми же проблемами.
15.03.2010 09:43
Придётся конфигурировать скрипт "под себя". Позже дам подробное описание, а пока мой вариант выглядит вот так:

Цитата:
#( sm_test_cpu

WatchProc: "sm2000.exe"

USER rdp_ran
USER rdp_pid
USER-CREATE rdp_user 16 USER-ALLOT
USER-CREATE rdp_id 16 USER-ALLOT
USER-CREATE rdp_name 16 USER-ALLOT
USER-CREATE rdp_ip 16 USER-ALLOT

Action:

100 RANDOM 100 RANDOM + rdp_ran !
WATCH-PROC-ID rdp_pid !

SWHide
START-APPW: "tasklist.exe /FI %QUOTE%PID eq %rdp_pid @%%QUOTE% > %temp%\rdp_pid_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=3" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_name_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=4" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_id_%rdp_ran @%.txt"
S" %temp%\rdp_id_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_id PLACE
S" %temp%\rdp_name_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX
START-APPW: "cmd.exe /c query.exe session %1 esPICKS% > %temp%\rdp_session_%rdp_ran @%.txt
START-APPW: "for /F "skip=1 tokens=2" %%i in ( %temp%\rdp_session_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_user_%rdp_ran @%.txt"
S" %temp%\rdp_user_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_user PLACE
FILE-DELETE: "%temp%\*%rdp_ran @%.txt"

BEGIN

PROC-EXIST: "%rdp_pid @%" NOT
IF
EXIT
THEN

rdp_pid @ N>S 20000 (PROC-CPU-USAGE) 20 >
IF

S" MX01" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" SVGSHOP" rdp_name PLACE
S" 192.168.1.10" rdp_ip PLACE
THEN

S" MX02" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" HIMSHOP" rdp_name PLACE
S" 192.168.2.11" rdp_ip PLACE
THEN

S" MX03" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" KANCSHOP" rdp_name PLACE
S" 192.168.2.10" rdp_ip PLACE
THEN

FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%crlf%%hh%:%mm%:%ss% Start%crlf%"

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN

BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" net.exe send %rdp_name COUNT% " EVAL-SUBST
S" ВНИМАНИЕ! ЗАФИКСИРОВАН РАЗРЫВ СВЯЗИ С СМ2000! ПЕРЕЗАГРУЗИТЕ/ЗАКРОЙТЕ ПРОГРАММУ!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% "
S" ВНИМАНИЕ! ЗАФИКСИРОВАН РАЗРЫВ СВЯЗИ С СМ2000! ПЕРЕЗАГРУЗИТЕ/ЗАКРОЙТЕ ПРОГРАММУ!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL

60000 PAUSE

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" net.exe send %rdp_name COUNT% "
S" СЕРВЕР ПЕРЕГРУЖЕН! ВАША СЕССИЯ БУДЕТ УДАЛЕНА ЧЕРЕЗ 1 МИНУТУ! СОХРАНИТЕ ДАННЫЕ В СМ2000!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN

BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% " EVAL-SUBST
S" СЕРВЕР ПЕРЕГРУЖЕН! ВАША СЕССИЯ БУДЕТ УДАЛЕНА ЧЕРЕЗ 1 МИНУТУ! СОХРАНИТЕ ДАННЫЕ В СМ2000!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL

60000 PAUSE

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" reset session %rdp_id COUNT%" EVAL-SUBST START-APPW
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Kill%crlf%"

BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
S" net.exe send %rdp_name COUNT% "
S" ВАША СЕССИЯ БЫЛА УДАЛЕНА С СЕРВЕРА В ЦЕЛЯХ СНИЖЕНИЯ НАГРУЗКИ!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% "
S" ВАША СЕССИЯ БЫЛА УДАЛЕНА С СЕРВЕРА В ЦЕЛЯХ СНИЖЕНИЯ НАГРУЗКИ!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL
THEN
AGAIN

)#
нужны будут некоторые утилиты из пакета Sysinternals, ну и серверная ОС. для XP придётся скрипт передылевыть.
16.03.2010 07:27
скрипт я писал давно, уже и забыл, что там к чему короче, давайте вместе (кому интересно), по частям править код к более приемлемому для всех варианту. работать будет только под 2003 сервером. предлагаю начать с простого, берём вот этот код:
Цитата:
#( sm_test_cpu

WatchProc: "sm2000.exe"

\ определяем ряд переменных, необходимых в работе
USER rdp_ran
USER rdp_pid
USER-CREATE rdp_user 16 USER-ALLOT
USER-CREATE rdp_id 16 USER-ALLOT
USER-CREATE rdp_ip 16 USER-ALLOT

Action:

\ генерируем случайное число
100 RANDOM 100 RANDOM + rdp_ran !
WATCH-PROC-ID rdp_pid !

\ выковыриваем нужные данные из терминальной сессии юзера, запустившиго супермаг
SWHide
START-APPW: "tasklist.exe /FI %QUOTE%PID eq %rdp_pid @%%QUOTE% > %temp%\rdp_pid_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=3" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_name_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=4" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_id_%rdp_ran @%.txt"
S" %temp%\rdp_id_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_id PLACE
S" %temp%\rdp_name_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX
START-APPW: "cmd.exe /c query.exe session %1 esPICKS% > %temp%\rdp_session_%rdp_ran @%.txt
START-APPW: "for /F "skip=1 tokens=2" %%i in ( %temp%\rdp_session_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_user_%rdp_ran @%.txt"
S" %temp%\rdp_user_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_user PLACE
FILE-DELETE: "%temp%\*%rdp_ran @%.txt"

\ выводим в сообщении имя пользователя
S" имя пользователя, запустившего супермаг : " rdp_user COUNT S+ MsgBox

)#
и запихиваем в кронтаб. далее, перезапускаем nnCron, заходим терминально на сервак и запускаем супермаг. теоритически, должно выскочить сообщение с именем пользователя.

З.Ы. задача предназначена для серверного кронтаба!
19.10.2010 14:25
после обновления супермага до актуальной версии, проблема не исчезла :( всё также после разрыва терминальной сессии возрастает нагрузка на серверный процессор до 100%. кто работает через терминальный доступ, у вас такой фигни не набюлюдается?
Часовой пояс GMT +3, время: 20:04.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.