Timeout della funzione di provaHo un singolo script che richiama molti altri script per i processi di reporting sulle apparecchiature e sulla creazione di report. A volte i dati provenienti dagli strumenti di processo includono errori che JMP non è in grado di gestire.Quindi ho racchiuso le chiamate in una funzione Try() come questa:
For(ii=1, ii < nitems(BulkScriptsToRun), ii++,
try(
Include( BulkScriptsToRun[ii] );
);
);
A volte lo script incluso non si arresta in modo anomalo, ma non termina nemmeno.
Anche se questo potrebbe probabilmente essere risolto modificando lo script e il modo in cui elabora i dati, non sono i miei script da modificare.
Esiste un modo per fare in modo che la funzione di prova consideri il tentativo un errore se impiega più di 1 ora, ad esempio?
C'è un altro modo per raggiungere questo obiettivo? C'è un modo per dire a Try() che dovrebbe arrendersi?
Grazie
Automazione e scriptingRe: Timeout della funzione di provaUno richiede che l'altro funzioni?Se lo script principale include in realtà solo una serie di script separati, perché non eseguirli semplicemente come un'attività diversa?Allora non importa.Ognuno aprirà la propria istanza di JMP, eseguirà e quindi chiuderà JMP.Puoi anche controllare il timeout di ciascuno individualmente.
Re: Timeout della funzione di provaSto eseguendo lo script principale dall'Utilità di pianificazione.E posso fare timeout lì. Ma se uno degli script presenta lo stesso errore ora dopo ora, giorno dopo giorno, tutti gli script sotto quello nell'elenco non verranno mai eseguiti.
A causa del modo in cui è organizzato lo script principale, gli script successivi nell'elenco vengono eseguiti meno frequentemente, quindi potrebbero essere necessarie settimane per notare che vengono saltati completamente.Potrei semplicemente invertire l'ordine dell'elenco, ma gli script che devono essere eseguiti ogni 10 minuti vengono saltati ogni volta finché non risolvo il problema nello script problematico (questo è peggio).
Inoltre, lo script principale segnala il proprio avanzamento dopo l'esecuzione di tutti gli script.Ciò non accadrebbe mai se l'attività venisse interrotta.
La mia soluzione attuale è: commentare lo script problematico e attendere che la parte responsabile si preoccupi abbastanza di risolverlo.
Funziona.
Re: Timeout della funzione di provaSembra qualcosa che potrebbe essere fatto con l'Utilità di pianificazione di Windows se non è possibile modificare gli script. Crea uno script che includa gli altri script, gestisci tutti gli errori possibili nello script di "inclusione" e aggiungi il timeout all'attività dello scheduler. Allo scadere del tempo, terminerà l'esecuzione ovunque sia arrivata.
In generale, l'esecuzione di batch di script su cui non hai il controllo può diventare rapidamente complicata perché potresti dover gestire molte cose diverse (ho dovuto fare qualcosa del genere). Di seguito sono riportati alcuni problemi (o opportunità di miglioramento) che ho riscontrato:
- Gestire la collisione dello spazio dei nomi
- Elimina/Cancella i simboli non necessari
- Sopravvivere alla situazione in cui gli script non utilizzano i nomi predefiniti qui(1)
- Sopravvivi all'utilizzo di Cancella simboli/Elimina valori globali nello script incluso
- Chiudi le tabelle dati e i report non necessari per risparmiare memoria
- Rilevamento degli errori che potrebbero arrestare JMP
- Utilizzo di Exit/Quit negli script inclusi
- Registra l'esecuzione dello script per sapere cosa è stato eseguito correttamente
La maggior parte di questi sono molto più facili da gestire addestrando/modificando gli script inclusi.
Re: Timeout della funzione di provaNo, try() non ha un meccanismo di timeout; è molto simile al meccanismo try-throw-catch del C++. Come stai indovinando, dovresti inserire la logica in ciascuno degli script inclusi, che potrebbero fare qualcosa del genere
startSeconds = tickSeconds();
...
while(...
if( tickseconds() - startSeconds > 100, throw("Used more than 100 seconds") );
...)
So che hai detto che non puoi aprire quegli script per la modifica, ma se lo facessi, potresti voler farli richiamare al tuo codice per indicare l'avanzamento. Quindi potresti eseguire il lancio dal callback, se necessario. In ogni caso dovresti trovare un punto in ciascuno degli script in cui un ciclo ripete qualcosa e il timeout dipende dal fatto che lo script si comporti ragionevolmente bene (per continuare a controllare l'ora).
Anche l'utilità di pianificazione di Windows potrebbe far parte della soluzione; Non l'ho usato ma ci sono stati diversi thread che pongono domande al riguardo. Posso chiudere il programma jmp da uno script?potrebbe suggerire qualcosa.