получить PID процесса 1С

1. evgeniy.korenev 06.05.11 03:38 Сейчас в теме
День добрый, коллеги.

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

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

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

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

Заранее благодарен.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. vcv 89 08.05.11 08:28 Сейчас в теме
Самый простой вариант, который сразу приходит в голову, это сделать несколько пользователей-роботов, у каждого указан личный каталог в конфигураторе. PID процесса определять утилитой handle от sysinternals по файлу 1cv7.lck в каталоге пользователя.
Для проверки "живости" сделать в выполняемой обработке, например, регулярное сохранение файл-флага. Потом проверять другим процессом дату-время файл-флага. Если слишком старый - робот повис.
6. kittystark 15 08.05.11 13:12 Сейчас в теме
идею в (2) с отдельным пользователем для каждого бота поддерживаю,
далее отвечая на сабж:
в коде 1С создать объект MSScriptControl.ScriptControl, в нем задать код обращения к WMI
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
    "select * from win32_process where name='1cv7.exe'" )
For Each objProcess in colProcesses
    PID = objProcess.ProcessId
    cmd = objProcess.CommandLine
    If objProcess.GetOwner ( User, Domain ) = 0 Then
          Wscript.Echo "Process " & _
              objProcess.Caption & _
              " belongs to " & Domain & _
              "\" & User
    Else
          Wscript.Echo "Problem " & Rtn & _
              " getting the owner for process " _
              & objProcess.Caption
    End If
Next
Показать

если твои роботы запускаются через OLE, то в переменной cmd будет подстрока embedding - круг кандидатов можно еще сузить
8. Abadonna 3958 08.05.11 13:59 Сейчас в теме
(6)If objProcess.GetOwner ( User, Domain ) = 0 Then
может ни фига и не дать, один юзверь в одном домене модет несолько процессов запустить, с разными PID.
Надо PID по хэндлу конкретного окна искать
10. evgeniy.korenev 08.05.11 14:47 Сейчас в теме
по сути, пока тут шло активное осуждение, решение было найдено.
подсказал мне его "Кириллка" с форума "Миста", за что ему и спасибо...

Функция Получить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());
КонецПроцедуры // Сформировать()
Показать


проверил... работает замечательно...
поцепил это счастье в "ПриначалеРаботыСистемы()" после определения глПользователь... прям там и храню все то время, пока он "жив"

ну а перезапуск по сути так же , как и (2) предложил, вот только в файл пишу еще и PID, а треевой прожкой проверяю, должен ли он был бы быть запущен, и ели да, то пере запускаю...

ну в общем то применений есть масса...
спасибо за помощь!
Serg2000mr; Mr.Fermer; ybatiaev; dour-dead; +4 Ответить
4. tango 506 08.05.11 10:39 Сейчас в теме
"В реестре по адресу HKCU\Control Panel\Desktop находится ключ HungAppTimeout, значение которого определяет интервал (в миллисекундах), через которое не отвечающее приложение считается зависшим. Кроме этого ключа, в той же ветви находятся ключи WaitToKillServiceTimeout (задаёт время ожидания перед уничтожением зависшей службы), и AutoEndTasks (при установке его значения в 1 системе дается разрешение удалять зависшие процессы самостоятельно)."
5. tango 506 08.05.11 11:40 Сейчас в теме
taskkill.exe /f /fi "status eq not responding"
7. kittystark 15 08.05.11 13:17 Сейчас в теме
легкое дополнение: wscript.echo - это для того, чтобы можно было код отладить, поместив его в *.vbs файл, в 1С это будет лишним...
9. Abadonna 3958 08.05.11 14:08 Сейчас в теме
11. Alex_Nash 28.09.21 06:20 Сейчас в теме
В случае v8 используем форматирование PID дочернего процесса

// Получаем rundll32 по PID'у
oChildProcess = oService.Get("Win32_Process.Handle=" + Формат(Число(oApp.ProcessID), "ЧГ="));


В противном случае рискуем попасть на
Произошла исключительная ситуация (SWbemServicesEx): Invalid object path
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)