Monitoraggio degli aggiornamenti dei file di registro dalla consoleCon JMP 17.2.0, sto cercando di monitorare l'output di un file di registro JSL da una console (terminale Mac OS, in questo caso). Sto usando il coda comandare con il -F opzione per visualizzare in tempo reale gli aggiornamenti ogni volta che il file viene scritto.
$ tail -f log.txt
Tuttavia, l'output della console non si aggiorna mai quando viene scritto un nuovo testo nel log. Il JSL di esempio riportato di seguito restituisce una riga di testo ogni secondo:
Open Log();
Clear Log();
For( ii=0, ii<10, ii++,
Write( "hello, world " || Char( ii ) || "\!n" );
Save Log( "log.txt" );
Wait( 1 );
);
Quando avvio lo script, eseguo il file coda comando pochi secondi dopo, ottengo un risultato atteso:
$ tail -f log.txt
/*:hello, world 0
hello, world 1
hello, world 2
hello, world 3
Ma i successivi messaggi di registro JSL non vengono rilevati dal file coda comando. Se io Ctrl-C fuori, quindi rieseguire coda , a quel punto ottengo correttamente tutto l'output nel file di registro. Ma l'output non si aggiorna mai più.
Qualche idea sul perché questo non funziona? O esiste forse un altro modo per gestire un file di registro in cui funzionerebbe come previsto?
Automazione e scriptingMac OSRi: Monitoraggio degli aggiornamenti dei file di registro dalla consoleL'uso della "versione powershell di tail" sembra funzionare bene (non verrà eseguito a meno che il file non esista prima)
Get-Content -Path "<logfilepath>" -Wait
https://stackoverflow.com/questions/4426442/unix-tail-equivalent-command-in-windows-powershell
Ho scritto il registro con
Names Default To Here(1);
For(i = 1, i <= 30, i++,
Show(i);
wait(1);
Save Log("$TEMP/jmplog/log.txt");
);
Puoi verificare manualmente che il file di registro venga aggiornato come ritieni e, in tal caso, iniziare a capire cosa c'è che non va in tail. Il registro di salvataggio potrebbe, ad esempio, ricreare il file ogni volta e la coda interrompe il monitoraggio in tempo reale a causa di ciò?
Di solito quando scrivo i log da JMP utilizzo Salva file di testo() . Per prima cosa crea il file con le intestazioni (se le ho) e poi usa mode("append") per aggiungere nuove righe. Solo se volevo ottenere l'intero contenuto del registro ho utilizzato Save Log() (ad esempio salvando il registro quando il codice presentava errori). Ottieni registro() può anche essere utile a volte.
Modifica: forse cambiare -f in -F potrebbe aiutare? https://man7.org/linux/man-pages/man1/tail.1.html
-f, --follow[={name|descriptor}]
output appended data as the file grows;
-F same as --follow=name --retry
--retry
keep trying to open a file if it is inaccessibleRi: Monitoraggio degli aggiornamenti dei file di registro dalla console@SteveTerry Se è perché JMP sta sostituendo il file e tail non riesce ad agganciarsi al nuovo file (sembra probabile), allora (pseudo codice, approssimativamente) qualcosa del genere:
xxx = get log text();
clear log(); // so each chunk is appended only once
savetextfile("log.txt", xxx, mode("append") );
in alternativa, potresti usare watch, qualcosa del genere
watch tail log.txt
per eseguire nuovamente il comando tail ogni pochi secondi. Più facile, ma non così efficiente.
Ri: Monitoraggio degli aggiornamenti dei file di registro dalla consoleGrazie @jthi , IL -F l'opzione è ciò che l'ha fatto funzionare. Non sono sicuro del motivo per cui non l'ho notato nel Uomo pagina - probabilmente perché sto usando -F per decenni e non amava pensare fuori dagli schemi. Cordiali saluti, il --riprova l'opzione non esiste su Mac; sembra che tu stia utilizzando JMP in un ambiente Linux?? Mi piacerebbe saperne di più.
Io uso Salva file di testo() in modo iterativo un bel po' per creare script JSL in modo dinamico, ma non penso che sia appropriato qui poiché non cattura il materiale inviato al registro, ad esempio, Scrivere() E Spettacolo() , quindi sarebbe un lavoro doppio.
@Craige_Hales , Grazie per i vostri suggerimenti. Per tua informazione, orologio non appare su Mac (per installazioni di base comunque - forse potrei installarlo manualmente), anche se lo vedo su Ubuntu. Oh mio Dio, stai in qualche modo combinando anche JMP con Linux?? 
Come avete indicato entrambi, sembra che sia così Salvare log() sta riscrivendo il file in modo da fornirgli un nuovo inode, che coda -f perde. Ciò sembra molto inefficiente. Posso immaginare come ciò potrebbe essere utile in alcune circostanze in cui è in corso una grande manipolazione del buffer di registro, come la cancellazione periodica. Ma penso che, per la maggior parte delle applicazioni, sarebbe di gran lunga preferibile se esistesse un meccanismo di svuotamento del buffer del registro in un file preassegnato. Il mio codice in realtà ha problemi Salvare log() comandi molto frequentemente per acquisire l'attività recente in caso di errore di runtime (così posso identificare cosa stava facendo l'ultima volta prima dell'errore). Ora sembra che questo stia creando un sacco di distruzioni del disco. È forse questa una nuova funzionalità che potrei suggerire?
Ri: Monitoraggio degli aggiornamenti dei file di registro dalla consoleEseguo JMP su Windows in esecuzione in un VirtualBox sotto Linux. JSL può parlare con Linux?Per esempio.
Penso che il desiderio che potresti voler aggiungere sia che JMP sia anche in grado di scrivere un registro di file su disco, in parallelo con la finestra di registro, possibilmente scaricando l'output su ogni riga.
Ri: Monitoraggio degli aggiornamenti dei file di registro dalla consoleSto eseguendo JMP su Windows. Ho appena cercato su Google coda e ho controllato quella pagina man (l'ho usata però con Cygwin per monitorare i log).
Ri: Monitoraggio degli aggiornamenti dei file di registro dalla consoleAggiunta questa funzione alla lista dei desideri nel caso in cui qualcuno desideri commentarla o votarla a favore.
https://community.jmp.com/t5/JMP-Wish-List/Provide-option-to-write-log-file-to-disk-in-parallel-with-the/idi-p/701103