Упаковка файлов

Gandliar

Lotus team
16.02.2004
341
8
#1
Привет!

Помогите пожалуйста решить проблему

запускается серверный агент с кодом

Код:
	Print "start+"
Dim WShell As Variant
Dim id As Long	
Dim command_message As String			
Set WShell = CreateObject("WScript.Shell")		
id = WShell.Run(command_message, 0, True)		
If Not id=0 Then
error_message = "Возникла проблема при выполнении командной строки '"+command_message+"'"					
Print error_message
End If	
Print "end+"
несколько раз. После очередного запуска выдается ошибка Agent 'test' error: Cannot create automation object

Помогает перезагрузка сервера лотус, потом происходит все аналогично.

Помогите побороть проблему.

Сервера lotus 5,5 и 6.0, системы - виртуалки windows 2003r2, скрипт сохраняется в 5,5 дизайнере


Причем заметил такую особенность. Если код вынести в библиотеку - то объект сразу не может создать.

Заранее благодарю.
 

garrick

Lotus team
26.10.2009
901
61
#2
А без WScript никак не обойтись? Обычным батником? Я бы вообще не рискнул бы использовать какое-либо OLE на сервере, даже если бы оно у меня было :)

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

Про OLE - попробуйте сначала использовать GetObject и если объект не получен, то тогда уже CreateObject.
 

Gandliar

Lotus team
16.02.2004
341
8
#3
А без WScript никак не обойтись? Обычным батником? Я бы вообще не рискнул бы использовать какое-либо OLE на сервере, даже если бы оно у меня было :)

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

Про OLE - попробуйте сначала использовать GetObject и если объект не получен, то тогда уже CreateObject.
WScript как раз и запускает обычный батник

на локале работает все отлично, на сервере - обычно со второго раза уже не запускается.

Wscript нужен чтобы дождаться исполнения батника (обычно в нем идет упаковка файлов и может занимать длительное время)
 

savl

Lotus team
28.10.2011
2 136
105
#6
Gandliar
Журнали рование в винде смотрели? может какие логи пишет система.
 

Gandliar

Lotus team
16.02.2004
341
8
#7
Gandliar
Журнали рование в винде смотрели? может какие логи пишет система.
Смотрел - нету там ничего

Я думаю проблема в лотус-сервере, 1 раз выполняет, второй раз - ошибка, помогает перезагрузка сервера
То есть видимо не освобождает объект почему-то
 

savl

Lotus team
28.10.2011
2 136
105
#8
так, ок...
Может garrick прав, попробовать получить через GetObject и если нет то создавать?

А если через Exec делать?
http://www.script-coding.com/WSH/WshShell.html#1.
Тогда можно будет батник запустить в дочернем потоке Ws, еще и управлять им немного.
Но есть подозрение, что тогда точно надо будет через GetObject идти первоначально.
 

Gandliar

Lotus team
16.02.2004
341
8
#9
так, ок...
Может garrick прав, попробовать получить через GetObject и если нет то создавать?

А если через Exec делать?
http://www.script-coding.com/WSH/WshShell.html#1.
Тогда можно будет батник запустить в дочернем потоке Ws, еще и управлять им немного.
Но есть подозрение, что тогда точно надо будет через GetObject идти первоначально.
через getObject - все равно пишет cannot create automation object

видимо оле на лотус-сервере падает почему-то
 

Gandliar

Lotus team
16.02.2004
341
8
#11
По завершению агента
Set WShell = Nothing

Лотус сам этот процесс не закроет
и так тоже пробовал - не помогает.

Написал на батниках

Код:
Function shellAndWait(commandList List As String, waitMax As Long) As Variant
Dim filePathTmp As String
filePathTmp = Environ("Temp")
Dim fileName As String
fileName = Format(Cstr(Now), "yyyymmddhhnnss")+Cstr(Int(Rnd()*1000))
'Создадим батник	
Dim fileNum As Integer
fileNum = Freefile()	
Open filePathTmp+"\"+fileName+".bat" For Output As FileNum
Forall c In commandList
Print #FileNum, c		
End Forall
'Впишем последней строкой копирование файла
Print #FileNum, "copy "+filePathTmp+"\"+fileName+".bat"+" "+filePathTmp+"\"+fileName+".bak"	
Close FileNum	
Dim id As Integer	
id = Shell(filePathTmp+"\"+fileName+".bat")	
'Проверим в цикле наличие файла
Dim i As Long
For i = 1 To waitMax
If Not Dir$(filePathTmp+"\"+fileName+".bak",0)="" Then
Kill filePathTmp+"\"+fileName+".bat"
Kill filePathTmp+"\"+fileName+".bak"
shellAndWait = True
Exit Function
End If
Sleep 1
Next		
End Function
 

garrick

Lotus team
26.10.2009
901
61
#13
WScript как раз и запускает обычный батник

на локале работает все отлично, на сервере - обычно со второго раза уже не запускается.

Wscript нужен чтобы дождаться исполнения батника (обычно в нем идет упаковка файлов и может занимать длительное время)
Всё понятно. WScript вам не нужен. Вам нужно переписать вашего агента на Java. Если с Java не дружите, то ЭТО должно помочь вам.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#14
wscript ожидает завершения процесса а обычный shell нет
вот буду пробовать извращаться с shell
а то что шелл возвращает ИД процесса который из лотуса можно спокойно мониторитьи отследить когда он завершился вам мало? ;)
 

Gandliar

Lotus team
16.02.2004
341
8
#15
Всё понятно. WScript вам не нужен. Вам нужно переписать вашего агента на Java. Если с Java не дружите, то ЭТО должно помочь вам.
Первая ссылка с поиска помогла, апишная функция работает похоже стабильно.

Большое спасибо всем кто откликнулся.