Как создать скрипт / программу, чтобы приложение работало всегда?

#c# #c #python

#c# #c #python

Вопрос:

У меня есть простой .exe, который должен выполняться непрерывно.

К сожалению, иногда оно неожиданно вылетает, и с этим ничего нельзя поделать.

Я имею в виду что-то вроде программы на C #, которая сканирует запущенное дерево приложений по таймеру, и если процесс останавливается, он перезапускает его … ? Хотя не уверен, как это сделать….

Есть еще идеи?

Комментарии:

1. «иногда оно неожиданно вылетает, и с этим ничего нельзя поделать». И вот почему программное обеспечение отстой.

Ответ №1:

Это довольно легко сделать, но «неожиданно происходит сбой, и с этим ничего нельзя сделать» звучит для меня крайне подозрительно. Возможно, вы имеете в виду, что рассматриваемая программа от третьей стороны, и вам нужно обойти проблемы, которые они не могут / не будут исправлять?

В любом случае, есть довольно много примеров кода, чтобы сделать именно то, о чем вы говорите.

Комментарии:

1. вы пробовали это?? выглядит интересно и, вероятно, должно подойти для моего проекта. Вы пробовали это в своем собственном процессе, а не в другом процессе?

2. Лично я предпочитаю устранить проблему сбоев, а не работать над ее обходом.

Ответ №2:

Первым решением было бы исправить ваш EXE-файл, чтобы он не зависал. Если вы не можете исправить это сейчас, вам, вероятно, нужно добавить обработку исключений, чтобы вы могли перехватывать исключение, а не закрывать EXE.

Второе решение — написать простую защитную программу, которая запустит ваш simple .exe и будет отслеживать определенный дескриптор процесса. Это перезапустит вашу программу, когда она закроется.

Комментарии:

1. что, программа guard тоже вылетает? Было бы неплохо, если бы оба этих exe-файла отслеживали друг друга.

2. @Nullstr1ng: Защитная программа должна быть написана правильно, чтобы не произошел сбой.

3. в любом случае, ему действительно нужно исправить эти сбои или просто перехватить все это и создать файл журнала с подробными сведениями об ошибках. @Джеймс, наверное, просто мера предосторожности.. допустим, они обнаружили программу guard и намеренно завершили ее.

Ответ №3:

самый простой способ — заставить вашу программу посмотреть, запущен ли экземпляр самой себя, и завершить работу, если это так. Настройте запланированную задачу так, чтобы она запускалась каждые пару минут.

 class Program
{
    static void Main(string[] args)
    {
        if (IsRunning())
        {
            return;
        }
        else
        {
            for (int x = 0; x < 10; x  )
            {
                //Do Stuff
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

    private static bool IsRunning()
    {

        Process[] P = Process.GetProcessesByName( Process.GetCurrentProcess().ProcessName  ) ;
        return P.Count() > 1;
    }
}
  

Комментарии:

1. Поиск процессов по имени далеко не безопасен. Вы не можете быть уверены, что найдете именно то, что искали.

Ответ №4:

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

Система.Пространство имен Diagnostics содержит классы, которые могут помочь, в частности «Process».

Например

 static Process[] Process.GetProcesses()
  

возвращает список всех запущенных в данный момент процессов.

Если вашего другого процесса нет в этом списке, вы просто перезапускаете его с помощью, например

 Process.Start()
  

Ответ №5:

Ваша программа должна изначально запустить сам ваш целевой процесс (с Process.Запустите), затем просто дождитесь его завершения (с помощью WaitForExit для объекта, возвращаемого процессом.Start()). После этого вся процедура повторяется.

Таким образом, вы будете уверены, что наблюдаете за интересующим вас процессом, и вам вообще не нужно опрашивать список процессов.

Процесс.Пример использования Start() и WaitForExit().