Update:
What I would recommend to accomplish your goal, would be to turn your batch into a Service. (Documentation here) By converting your batch into a Service it no longer becomes subject to users being logged in, permission issues, it will run as a SYSTEM ACCOUNT. This in itself can alleviate a lot of anger for the process.
After you’ve completed that, you can write a batch file that ensures that your Service is indeed running. Your current issue, is it doesn’t automatically restart. Well, a Service always runs- Even if it has an error it will still attempt to run.
Which means unless it has a Fatal Exception your Service should always work- But for certainty you can create a batch that will ensure your Service is running.
An example:
:START
timeout 3600
for /F "tokens=3 delims: " %%H in ('sc query "MyServiceName" ^| findstr "
if /I "%%H" NEQ "RUNNING" (
NET START "MyServiceName"
REM Service has Started...
)
)
GOTO START
So in theory every 3,600 seconds it will test if your Service is running, if it isn’t it will start the Service for you.
Important:
This is more the proper way to resolve your issue, rather then circumvent it. However, as I noted your batch should still implore Exception Handling to ensure your application doesn’t fall into an unusable state. This still isn’t the best way, as it should implore Exception Handling and Verification to test against it’s state.
As I mentioned before, you have a lot of methods to solve your issue. However, your thinking in a Linear Mindset. Which means:
- Execute Command, Goal Guaranteed.
- If I do this, this happens.
Essentially based on the minimal example I saw, it looks like you’ve created an infinite loop to continually execute your command. My question to you: When your loop has an error, how can it continue to run?
You’ve already stated that it happens in random areas- Nothing is random, those are more then likely areas that require some verification / testing to ensure it remains in a proper state. The faster your identify the potential problems, the more effective your program can run with no errors.
Hopefully that helps-
What exactly does your batch application do?
The reason I ask is because you can circumvent the issue with Windows Task Scheduler which allows you to configure some parameters to auto start and auto open particular applications based on your specified criteria. Will it be ideal? Will it truly automate to your needs- More then likely not.
As mentioned above by GolezTrol, the cause of your error will be the more important aspect to resolve your issue. Based on your remark
The errors are different each time, to be honest.
That could be an indicator that the batch script doesn’t adhere to testing but rather assuming it successfully completed. Without any underlining information such as:
- Function
- Code Example
- Where an error occurred, and during what task.
It makes it relatively difficult to point you in the proper direction. One thing that I would consider is IF. This is a fundamentally basic task but is quite important-
if(Directory.Exists(dirName))
{
// Do This
}
else
{
// Do This
}
I find the C# outline an easier method to understand the purpose of the IF. You can actually implement something similar in your batch. You would accomplish it like this:
if exist { insert file name } (
rem file exists
) else (
rem file doesn't exists
)
or you can accomplish it like this:
if exists c:\myFile.bat notepad c:\myFile.bat
If C:\myFile.bat exists, then open notepad. The reason this is an important is because if the variable doesn’t exists, then it can not be affected. This allows your application to essentially make decisions in a very primitive manner.
You have quite a bit of flexibility- There are a lot of examples on this topic because batch programming has been around for a very, very long time. Another alternative would be to eventually move to Powershell. It will have access to the Windows Management Interface (WMI).
Hopefully this points you in the right direction, without more information our answers may not be much help.
Каким образом перезапустить файл после ошибки?
try/except (и finally) не подойдет, так как ошибка возникает в блоке except. Нужно чтобы файл (или код) полностью перезапускался после ошибки. Я слышал что-то о systemd и restart: on-failure в нем, но так и не понял как этой штуковиной пользоваться.
-
Вопрос задан
-
75 просмотров
Судя по systemd вы в линуксе? Значит у вас os.system(command) вернёт exit code, который при нормальном завершении равен нулю.
import os
while True:
exit_code = os.system("python3 script.py") # Возможно тут следует написать полные пути
if exit_code == 0:
print("success!")
break
print(f"exit_code is {exit_code}, will retry")
А systemd это уже ближе к администрированию целой системы. Это фоновые сервисы и задачи, и т. п.
Пригласить эксперта
-
Показать ещё
Загружается…
22 сент. 2023, в 23:30
6500 руб./за проект
22 сент. 2023, в 23:29
10000 руб./за проект
22 сент. 2023, в 23:14
8000 руб./за проект
Минуточку внимания
Обновить:
То, что я рекомендовал бы для достижения вашей цели, было бы превратить вашу партию в Сервис. (Документация здесь). Преобразуя свою партию в службу, она больше не становится подчиненной пользователям, которые разрешают вход, и разрешает проблемы, она будет работать как СЧЕТ СИСТЕМЫ. Это само по себе может облегчить много гнева для процесса.
После этого вы можете написать пакетный файл, который гарантирует, что ваша Служба действительно работает. Ваша текущая проблема, не перезагружается ли она автоматически. Ну, сервис всегда runs- Даже если у него есть ошибка, он все равно попытается запустить.
Это означает, что если у него нет фатального исключения, ваша служба всегда должна быть work-. Но для уверенности вы можете создать пакет, который обеспечит вашу службу.
Пример:
:START
timeout 3600
for /F "tokens=3 delims: " %%H in ('sc query "MyServiceName" ^| findstr "
if /I "%%H" NEQ "RUNNING" (
NET START "MyServiceName"
REM Service has Started...
)
)
GOTO START
Поэтому теоретически каждые 3600 секунд он будет проверять, работает ли ваша Служба, если это не значит, что она запустит Сервис для вас.
Важно: это более правильный способ решить вашу проблему, а не обходить ее. Тем не менее, поскольку я отметил, что ваша партия все еще должна умолять об Exception Handling убедитесь, что ваше приложение не попадает в непригодное для использования состояние. Это все еще не самый лучший способ, так как он должен умолять об Exception Handling и Verification для проверки состояния.
Как я уже говорил, у вас есть много способов решить вашу проблему. Тем не менее, ваше мышление в линейном мышлении. Что значит:
- Выполнение команды, цель гарантирована. Если я это сделаю, это произойдет.
Основываясь на минимальном примере, который я видел, похоже, что вы создали бесконечный цикл, чтобы постоянно выполнять свою команду. Мой вопрос к вам: когда ваш цикл имеет ошибку, как он может продолжать работать?
Вы уже заявили, что это происходит случайно areas-. Ничто не является случайным, это более вероятные области, которые требуют некоторой проверки/тестирования, чтобы убедиться, что он остается в правильном состоянии. Чем быстрее выявляются потенциальные проблемы, тем эффективнее ваша программа может работать без ошибок.
Надеюсь, что helps-
Что именно делает ваше пакетное приложение?
Причина, о которой я прошу, заключается в том, что вы можете обойти эту проблему с помощью планировщика заданий Windows, который позволяет вам настроить некоторые параметры для автоматического запуска и автоматического открытия определенных приложений на основе ваших определенных критериев. Будет ли это идеально? Будет ли он действительно автоматизировать ваш needs-. Скорее всего, нет.
Как упоминалось выше GolezTrol, причиной вашей ошибки будет более важный аспект для решения вашей проблемы. Основываясь на вашем замечании
Если честно, ошибки разные.
Это может быть индикатором того, что пакетный скрипт не подходит для тестирования, а предполагает, что он успешно завершен. Без какой-либо дополнительной информации, такой как:
- функция Пример кода Там, где произошла ошибка, и во время какой задачи.
Это делает довольно трудным указать вас в правильном направлении. Одна вещь, которую я бы рассмотрел, — это ЕСЛИ. Это фундаментально основная задача, но вполне important-
if(Directory.Exists(dirName))
{
// Do This
}
else
{
// Do This
}
Я нахожу схему С# более простым способом понять цель IF. Фактически вы можете реализовать что-то подобное в своей партии. Вы сделали бы это так:
if exist { insert file name } (
rem file exists
) else (
rem file doesn't exists
)
или вы можете сделать это следующим образом:
if exists c:\myFile.bat notepad c:\myFile.bat
Если C:\myFile.bat существует, тогда откройте блокнот. Причина в том, что это важно, потому что, если переменная не существует, она не может быть затронута. Это позволяет вашему приложению существенно принимать решения очень примитивно.
У вас довольно много flexibility-. В этой теме много примеров, потому что пакетное программирование существует очень и очень долгое время. Другой альтернативой было бы перейти в Powershell. Он будет иметь доступ к интерфейсу управления Windows (WMI).
Надеюсь, это указывает на то, что вы в правильном направлении, без дополнительной информации наши ответы могут быть не очень полезными.
Обновление:
Что я бы порекомендовал для достижения вашей цели, так это превратить ваш пакет в Сервис. (Документация здесь) Путем преобразования вашего пакета в Сервис он больше не зависит от входа пользователей в систему, проблем с разрешениями, он будет работать как СИСТЕМНАЯ УЧЕТНАЯ ЗАПИСЬ. Это само по себе может смягчить гнев по поводу процесса.
После этого вы можете написать пакетный файл, который гарантирует, что ваша Служба действительно работает. Ваша текущая проблема заключается в том, что он не перезапускается автоматически. Итак, Служба работает всегда. Даже если в ней есть ошибка, она все равно попытается запуститься.
Это означает, что если у него нет Fatal Exception, ваш Сервис всегда должен работать. Но для уверенности вы можете создать пакет, который обеспечит ваш Служба работает.
Пример:
:START
timeout 3600
for /F "tokens=3 delims: " %%H in ('sc query "MyServiceName" ^| findstr "
if /I "%%H" NEQ "RUNNING" (
NET START "MyServiceName"
REM Service has Started...
)
)
GOTO START
Таким образом, теоретически каждые 3600 секунд он будет проверять, работает ли ваш Service, если нет, он запустит Service для вас.
Важно: Это более правильный способ решить вашу проблему, а не обойти ее. Однако, как я уже заметил, ваш пакет должен по-прежнему запрашивать Exception Handling, чтобы ваше приложение не попало в непригодное для использования состояние. Это все еще не лучший способ, так как он должен умолять Exception Handling и Verification проверить его состояние.
Как я уже упоминал ранее, у вас есть много способов решить вашу проблему. Тем не менее, ваше мышление соответствует линейному мышлению. Что значит:
- Выполните команду, цель гарантирована.
- Если я это сделаю, это произойдет.
По сути, исходя из минимального примера, который я видел, похоже, что вы создали бесконечный цикл для непрерывного выполнения вашей команды. Мой вопрос к вам: Если в вашем цикле возникла ошибка, как он может продолжать работать?
Вы уже заявили, что это происходит в случайных областях. Ничто не является случайным, это более чем вероятные области, которые требуют некоторой проверки / тестирования, чтобы убедиться, что они остаются в надлежащем состоянии. Чем быстрее вы определите потенциальные проблемы, тем эффективнее будет работать ваша программа без ошибок.
Надеюсь, это поможет-
Что именно делает ваше пакетное приложение?
Причина, по которой я спрашиваю, заключается в том, что вы можете обойти проблему с помощью Планировщика заданий Windows, который позволяет настраивать некоторые параметры для автоматического запуска и автоматического открытия определенных приложений на основе заданных вами критериев. Будет ли это идеальным? Будет ли он действительно автоматизирован в соответствии с вашими потребностями? Скорее всего, нет.
Как упоминалось выше от GolezTrol, причина вашей ошибки будет более важным аспектом для решения вашей проблемы. На основании вашего замечания
Ошибки каждый раз разные, если честно.
Это может указывать на то, что пакетный скрипт не придерживается тестирования, а скорее предполагает его успешное завершение. Без какой-либо подчеркивающей информации, такой как:
- Функция
- Пример кода
- Где произошла ошибка и во время какой задачи.
Это делает относительно трудным указать вам правильное направление. Одна вещь, которую я бы рассмотрел, это IF. Это принципиально основная задача, но весьма важная.
if(Directory.Exists(dirName))
{
// Do This
}
else
{
// Do This
}
Я считаю схему C# более простым способом понять назначение IF. Вы действительно можете реализовать что-то подобное в своем пакете. Вы бы сделали это следующим образом:
if exist { insert file name } (
rem file exists
) else (
rem file doesn't exists
)
Или вы можете сделать это следующим образом:
if exists c:\myFile.bat notepad c:\myFile.bat
Если C:\myFile.bat существует, откройте блокнот. Причина, по которой это важно, заключается в том, что если переменная не существует, на нее нельзя повлиять. Это позволяет вашему приложению принимать решения очень примитивным образом.
У вас есть некоторая гибкость. Есть много примеров по этой теме, потому что пакетное программирование существует уже очень и очень давно. Другой альтернативой может стать переход на Powershell. У него будет доступ к интерфейсу управления Windows (WMI).
Надеюсь, это укажет вам правильное направление, без дополнительной информации наши ответы могут не помочь.
5
Greg
10 Июл 2013 в 22:54
Возможно, это решит вашу проблему:
http://nssm.cc/usage
По сути, это то, что вы добавляете в nssm некоторый bat-файл и делаете его сервисом.
В части «Действие при выходе» говорится:
Чтобы настроить действие, которое должен выполнять nssm при выходе из приложения, измените значение по умолчанию ключа HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit. Если ключ не существует в реестре при запуске nssm, он создаст его и установит значение Restart.
0
Peter
10 Июл 2013 в 22:33
Если у вас достаточно свежая версия Vim (не знаю, какая именно, но если вы запускаете vim --version , вам нужно увидеть +timers), вы можете установить асинхронный таймер, чтобы проверить, был ли файл изменен, и запустите другой cfile errors.txt чтобы перезагрузить содержимое окна быстрого исправления. Вот доказательство правильности концепции (проверьте здесь для подсвеченной версии):
" The filename used for the cfile
let s:cfile_filename = ''
" The last mtime of the filename
let s:cfile_mtime = -1
" Define a command that can be called like:
"
" Cfile errors.txt
"
command! -nargs=1 -complete=file Cfile call s:Cfile(<f-args>)
function! s:Cfile(filename)
let s:cfile_filename = a:filename
" Update every 200ms
let timer = timer_start(200, function('s:UpdateCfile'), {'repeat': -1})
" First "update" to actually load the qf window immediately
call s:UpdateCfile(timer)
endfunction
function! s:UpdateCfile(timer_id)
" Stop the timer if the file is deleted
if s:cfile_filename == '' || !filereadable(s:cfile_filename)
call timer_stop(a:timer_id)
let s:cfile_filename = ''
let s:cfile_mtime = -1
return
endif
" Get file mtime
let mtime = system('stat -c %Y '.shellescape(s:cfile_filename))
" Load the file in the quickfix window if the mtime is newer than the last
" recorded one
if mtime > s:cfile_mtime
exe 'cfile '.s:cfile_filename
let s:cfile_mtime = mtime
endif
endfunction
Если вы поместите это в ваш .vimrc или в отдельный файл в ~/.vim/plugins/ , вы получите команду :Cfile вы можете использовать точно так же, как и «настоящую», за исключением того, что она также будет контролировать файл Вы дали это для изменений каждые 200 мс. Он остановит автообновление при удалении файла.
К сожалению, я почти уверен, что будут крайние случаи, о которых вам придется позаботиться, поэтому я рекомендую вам использовать это как отправную точку, попытаться понять это (используя :help для любых функций или команд, которые вы не знаю), и построить что-то, что соответствует вашим конкретным потребностям.
