Riavvia automaticamente l'applicazione alla chiusura


10

Ho un'applicazione server che voglio eseguire ogni volta che il computer è in esecuzione e di solito questo è il caso, tranne che a volte trovo che si sia chiuso da solo.

Esiste un pipistrello o uno script che posso eseguire per monitorare l'applicazione e riavviarla se dovesse chiudersi?


Che tipo di applicazione e come si avvia normalmente? Come servizio, nel registro come comando di esecuzione o nella cartella di avvio?
KCotreau,

Comando di esecuzione del registro. con l'opzione '-start'.
Sid

Cosa succede attualmente se si esegue di nuovo quel comando con l'app già in esecuzione?
KCotreau,

Niente. Il comando riconosce che l'applicazione è già in esecuzione.
Sid

Risposte:


12

Questo non sempre funziona (dipende dal modo in cui il programma si carica da solo), ma normalmente è possibile creare un file batch come questo:

@Echo off
:Start
NotePad
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

goto Start

Ho usato Blocco note come esempio.

Le linee

echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

sono solo un ritardo (di 10 secondi) per dare all'utente la possibilità di interrompere il processo prima che si riavvii.

La linea

echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 

non è necessario, ma accederà ogni volta che il programma viene chiuso in un file, quindi potrebbe essere utile diagnosticare il problema. ErrorLevel potrebbe non dirti molto, ma un programma dovrebbe restituire 0 se si chiude normalmente e un non -zero messaggio se non lo fa

Nota, dici che il tuo programma non fa nulla se è già in esecuzione. Questo di solito significa che l'applicazione si avvia, rileva che un'altra copia è già in esecuzione e si arresta immediatamente. In tal caso, e il programma è in esecuzione prima dell'avvio di questo file batch, il batch eseguirà il ciclo circolare e tenterà di avviare il programma ogni dieci secondi.


"quindi il batch eseguirà il ciclo circolare e tenterà di avviare il programma ogni dieci secondi." è una cosa negativa?
posfan12

Grazie!! Un po 'di copia e incolla alle 12:52, e posso andare a dormire senza (troppo) preoccuparmi di ciò che troverò (o non troverò) al mattino. Uh. nella mattina post-sonno.
Spike0xff,

2

Sulla base delle risposte precedenti, ciò che suggerisco è di inserire quel comando in un file batch, quindi impostare quel file batch in modo che venga eseguito come attività pianificata ogni minuto. Non vi è praticamente alcun sovraccarico associato a questo, e garantisce che il tuo processo venga dichiarato indipendentemente dal fatto che tu sia in giro per rendersi conto che si è fermato.


Questo mi sembra una soluzione piuttosto goffa e inefficiente, sebbene rapida. Esiste forse un mezzo più appropriato per lo stesso scopo? Grazie per l'aiuto!!!
Sid

Sid, come ho detto, il sovraccarico è MOLTO minimo, ed è FACILE da fare. Se vuoi trovare un modo per codificare qualcosa da controllare per vedere se è in esecuzione, e poi per riavviarlo, sentiti libero, ma lo sto facendo da molto tempo con risultati positivi. È un metodo comune utilizzato quando si hanno applicazioni, di solito su un server, che si fermano.
KCotreau,

Di gran lunga il metodo più semplice. E non c'è sovraccarico.
surfasb,

2

Immagino che la risposta giusta a questa domanda dipenda dal perché tu voglia farlo. Stai cercando di risolvere l'arresto accidentale? Prevenire l'arresto casualmente "dannoso" da parte degli utenti della macchina (ad es. Dipendenti che chiudono il software di monitoraggio)? Prevenire attacchi dannosi gravi e qualificati? Stai cercando di scrivere malware da solo (nel qual caso, per favore, zittisci ;-))?

Inoltre, come hanno già detto altri commentatori, sarebbe diverso se avessi scritto un servizio Windows (ad esempio)

Personalmente, probabilmente inizierei scrivendo una seconda applicazione e avviandola allo stesso modo. Chiedi a entrambe le applicazioni di eseguire periodicamente una scansione reciproca e di riavviarlo, se necessario, assicurati di fornire un modo semplice per chiudere legittimamente l'applicazione!

Detto questo, e dato il tuo commento "a volte lo troverò chiuso da solo" Vorrei davvero iniziare cercando di scoprire perché è chiuso ...


Uso il computer come media server e l'applicazione offensiva è mediaserver.exe. Niente di male. Non riesco a prevedere nessuno scenario in cui vorrei chiudere l'applicazione, ma se lo facessi, non ci sarebbe motivo per cui non potrei fermare prima lo script o il pipistrello. Inoltre, non sono in grado di scrivere software, ma ho familiarità con i file bat. cioè sono un noob.
Sid

Mi scuso: sarei io a pensare che fossi nel gruppo "Programmatori" e che avresti scritto tu stesso l'app :-) Per quanto possa sembrare goffo, suggerirei l'approccio del "compito programmato" descritto da @KCotreau
Steve Mallam il

2

È possibile utilizzare un programma chiamato ReStartMe 2.0 [ Mirror ] fa esattamente questo:

Controlla i processi e li riavvia se si chiudono.


-1

è molto meglio! questo è un po 'di codice che sto usando per un server di gioco più minuscolo che deve essere salvato su un file .bat

@echo off
rem This is a comment line
rem This one is a comment too
rem Following line ensures the working directory is searched in C:
C:
rem Join the correct directory, where the server stuff lies in:
cd "C:\Users\morenavaj\Documents\minetest-0.4.16-win64 - Lone_Wolf\"
:love_spaghetti_code
bin\server.lnk --config minetest.conf ^
            --worldname "Land of Blockheads" ^
            --gameid minetest_game ^
            --port 30000 ^
            --logfile bin/debug.txt

echo Restarting server....
goto love_spaghetti_code

echo Done (this should never, ever, happen)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.