Timeout della funzione di provaHo un unico script che richiama molti altri script per i processi di reporting su apparecchiature e rapporti di costruzione. A volte i dati provenienti dagli strumenti di elaborazione includono errori che JMP non è in grado di gestire.Quindi ho racchiuso le chiamate in una funzione Try() in questo modo:
For(ii=1, ii < nitems(BulkScriptsToRun), ii++,
try(
Include( BulkScriptsToRun[ii] );
);
);
A volte lo script incluso non va in crash, ma non finisce 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.
C'è un modo per fare in modo che la funzione try 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
SceneggiaturaRe: Timeout della funzione tryNo, try() non ha un meccanismo di timeout; è molto simile al meccanismo try-throw-catch di C++. Come indovina, dovresti inserire la logica in ciascuno degli script inclusi, il che potrebbe 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 hai fatto, potresti voler fargli richiamare il tuo codice per indicare i progressi. Quindi potresti eseguire il tiro dalla richiamata, se necessario. In ogni caso, dovresti trovare un punto in ciascuno degli script in cui un ciclo sta ripetendo qualcosa e il timeout dipende dal comportamento dello script ragionevolmente ben (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 un certo numero di thread che hanno posto domande a riguardo. Posso chiudere il programma jmp da uno script?potrebbe suggerire qualcosa.
Re: Timeout della funzione trySembra 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 che puoi nello script di "inclusione" e aggiungi il timeout all'attività di pianificazione. Dopo che è scaduto il tempo, interromperà l'esecuzione ovunque sia arrivata.
In generale, l'esecuzione di batch di script su cui non hai il controllo può diventare rapidamente disordinata 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:
- Gestisci la collisione dello spazio dei nomi
- Elimina/Cancella i simboli non necessari
- Sopravvivi a situazioni in cui gli script non utilizzano i nomi predefiniti qui(1)
- Sopravvivi all'uso di Cancella simboli / Elimina globali nello script incluso
- Chiudi tabelle di dati e rapporti non necessari per risparmiare memoria
- Errori di cattura che fermerebbero 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 trySto eseguendo lo script principale dall'Utilità di pianificazione.E posso andare in timeout lì. Ma se uno degli script ha lo stesso errore ora dopo ora, giorno dopo giorno, tutti gli script al di sotto di quello nell'elenco non verranno mai eseguiti.
In base al modo in cui lo script master è organizzato, gli script più avanti nell'elenco vengono eseguiti meno frequentemente, quindi potrebbero essere necessarie settimane per notare che vengono completamente ignorati.Potrei semplicemente invertire l'ordine dell'elenco, ma poi gli script che devono essere eseguiti ogni 10 minuti vengono saltati ogni volta fino a quando non risolvo il problema nello script problematico (questo è peggio).
Inoltre, lo script master segnala il proprio avanzamento dopo l'esecuzione di tutti gli script.Ciò non accadrebbe mai se l'attività viene interrotta.
La mia soluzione attuale è: commentare lo script problematico e attendere che la parte responsabile si preoccupi abbastanza per risolverlo.
Funziona.