Имя: Пароль:
1C
 
получить PID процесса 1С
0 MiracMC
 
06.05.11
11:42
День добрый, коллеги.

Так и не нашел места, куда бы приткнуть свой вопрос, что бы он был в тему.

В общемто сабж.

По сути есть сервер, на котором кроме людей работают еще и боты "1С"... и бывает момент, что кто то из них "умирает". В дереве процессов есть несколько одноименных процессов 1Сv7.exe. А вот как опредилить, какой именно из них уже висит - непонятно.
Естественно, что если бы меня интерисовл вопрос "рученоого воскрешения умершого" - я бы и не парился особо. но задача сделать это програмно.

Вопрос: можно ли как то получить PID процесса 1C из пол ние самой, что б передать уго кудато дальше (не суть куда)?

Заранее благодарен.
1 MiracMC
 
06.05.11
11:44
ам... немного не туда разместил...
v7 собственно!
2 skunk
 
06.05.11
11:45
постараться победит причину умирания ботов и устранить
3 Irbis
 
06.05.11
11:50
Боты должны самоубилься делать после окончания работы, а не висеть по тыще лет.
4 dk
 
06.05.11
11:52
узнать-то можно, тока как ты заставишь "зависшие" процессы сообщать тебе их pid?
5 Сверчок
 
06.05.11
11:55
не-е-е, вопрос-то, на самом деле, весьма стоящий.
разумеется, это тема далеко не "7.7", а вовсе даже "IT".
но вопрос правильный. а именно -- вопрос получения статуса определённого процесса.
6 Кириллка
 
06.05.11
11:57
можно конечно. На мисте даже код пробегал от старого еврея, в котором используется получение PID'а
7 dk
 
06.05.11
11:58
угу, абрахамс красивое решение выкладывал через запуск процесса и возврат parentprocessid
8 dk
 
06.05.11
11:59
но таки это не решит проблему зависших
9 andrewks
 
06.05.11
12:02
(6) старого? не боишься, что обидится?
10 Кириллка
 
06.05.11
12:03
копирайты его, а может MS :)

//________________________________________________________________________________
//
Функция ПолучитьPID()
   Перем oLocator, oService, oShell, oApp, oChildProcess;
   Перем чPID;
   
   чPID = -1;
   
   Попытка
       oLocator = СоздатьОбъект("WbemScripting.SWbemLocator");
       oService = oLocator.ConnectServer(".", "root\CIMV2");
       
       // Запускаем дочерний rundll32.exe
       //
       oShell = СоздатьОбъект("WScript.Shell");
       oApp = oShell.Exec("rundll32.exe kernel32,Sleep");
       
       // Получаем rundll32 по PID'у
       //
       oChildProcess = oService.Get("Win32_Process.Handle=" + oApp.ProcessID);
       
       // Получаем PID родительского процесса - 1с
       //
       чPID = oChildProcess.ParentProcessID;
       
       // Завершаем rundll32, чтобы не мусорить
       //
       oChildProcess.Terminate();
   Исключение
       // нуу, может не быть прав на эти вещи, например.
   КонецПопытки;
   
   Возврат чPID;
КонецФункции // ПолучитьPID()

//________________________________________________________________________________
//
Процедура Сформировать()
   Сообщить("PID: " + ПолучитьPID());
КонецПроцедуры // Сформировать()
11 Кириллка
 
06.05.11
12:07
(8)если бы (0) спрашивал, как решить проблему зависающих процессов, то да. А так, человек задал конкретный вопрос, в ожидании получить конкретный ответ.
12 NS
 
06.05.11
13:59
(11) Почему не решит? Решит.
Пишешь батник, который рубит процессы работающие больше определенного времени. Его в шедулер.

При запуске бота писать в файл PID и время запуска.
13 Skom
 
06.05.11
14:28
(0) на script-coding.info много интересного найдешь
14 Skom
 
06.05.11
14:28
+(13) о как
сайт переехал
по адресу
http://www.script-coding.com/
15 andrewks
 
06.05.11
14:30
(14) давно как перееехал
16 Kreont
 
06.05.11
14:31
(0)боты "1С" запускай через шедулер с установкой максимального времени выполнения, тогда ОСь сама аго отрубит, неважно завис он или еще не доделал работу.
17 Skom
 
06.05.11
14:31
(16) он сам разберется как ему ботов запускать
может они постоянно висеть должны.
18 Torquader
 
06.05.11
22:35
(16) А потом ТИИ базы ты за них делать будешь ?
Процесс 1С должен завершаться корректно, если это возможно.
P.S. процесс 1С очень редко виснет, а вот ошибка в обработке приводит к тому, что обработка завершается, а 1С просто висит и ждёт, когда кто-то нажмёт клавишу (и если она запустилась в отдельном DeskTop-е, то ждёт вечно).
Но, можно использовать ОбработкаОжидания или DDE_Request, чтобы привести процесс "в чувство" и продолжить работу - а вы "догнать и убить" сразу.
19 MiracMC
 
07.05.11
00:44
(10) - спасибо огромное... буду тестировать.
(12) - почти угодали суть.

поясню...
бота можно запустить и остановить.. не есть проблема...
но вот незадача... боты у меня на "просторах" VMware живут..
у "Вари" есть проблема - переодичкая потеря коннекта к базе по сети... сам не знаю, или виртуальный адаптер дает сбой, или еще что то. ну и естественно процессы продолжают висеть в стадии "CodeBase Error"...
тут уже все равно, закрою я их гуманно, или нет...
всеравно прибегнуть к ТИИ  прийдется...
но это уже другой вопрос.

по сути есть у меня 10-ок ботов... все на одной машине...
но падают как то странно.. не все... и не из за ошибок в базе.
и перезапускать надо естетственно не всех...

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

протестирую завтра и отпишусь.. спасибо...
20 MiracMC
 
07.05.11
00:46
более подробно по сути ВАРИ изложил  1с 7.7. + VMware Workstation 7.1.3
21 MiracMC
 
07.05.11
14:08
(10) - СПАСИБО ЕЩЕ РАЗ ОГРОМНОЕ!!!
РАБОТАЕТ!!!!
22 Кириллка
 
08.05.11
18:44
(21)ну ты это не мне спасибо, а абрахамсу - он постил этот код.