2014-05-14 10 views
6

Sto utilizzando uno script bash che richiama più processi che devono essere avviati in un ordine particolare e alcune azioni devono essere completate (quindi stampano determinati messaggi per i registri) prima che il successivo possa essere avviato. Lo script bash ha il seguente codice che funziona davvero bene per la maggior parte dei casi:Ottimizzazione dello script Bash per l'attesa di una stringa specifica nei file di registro

tail -Fn +1 "$log_file" | while read line; do 
    if echo "$line" | grep -qEi "$search_text"; then 
     echo "[INFO] $process_name process started up successfully" 
     pkill -9 -P $$ tail 
     return 0 
    elif echo "$line" | grep -qEi '^error\b'; then 
     echo "[INFO] ERROR or Exception is thrown listed below. $process_name process startup aborted" 
     echo " ($line) " 
     echo "[INFO] Please check $process_name process log file=$log_file for problems" 
     pkill -9 -P $$ tail 
     return 1 
    fi 
done 

Tuttavia, quando abbiamo fissato i processi per stampare la registrazione in modalità debug, stampano tanto di registrazione che questo script non può tenere il passo, ed è richiede circa 15 minuti dopo il completamento del processo per il recupero dello script bash. C'è un modo per ottimizzarlo, come cambiare 'mentre leggi linea' a 'mentre leggi 100 righe', o qualcosa del genere?

risposta

4

Che ne dici di non scomporre fino a due processi grep per riga di registro?

tail -Fn +1 "$log_file" | grep -Ei "$search_text|^error\b" | while read line; do 

Così una lunga esecuzione grep processo deve fare la pre-elaborazione, se vuoi.

Modifica: Come indicato nei commenti, è più sicuro aggiungere --line-buffered all'invocazione grep.

+0

questo ha funzionato brillantemente, grazie! – Matt

+1

A volte funzionava, ma non altri (era sospeso) - alcune ricerche su SO mostrano che devo anche aggiungere il buffer di riga (grep --line-buffered -qEi "$ search_text |^error \ b") per garantire che l'output di grep viene inviato alla riga di lettura non appena viene trovato, invece di essere perso nel buffer interno di grep – Matt

+0

Oops wait, penso che in realtà ho fatto un boo-boo lì. Dovrebbe essere solo 'grep -Ei', perché' grep -qEi' ** farà cadere ** le linee che corrispondono effettivamente. Argh! (Come mai questo ha funzionato per te è alquanto al di fuori di me;) –

0

Alcuni consigli importanti per questo script:

  • Checking that the service is doing its job è un controllo molto migliore per l'avvio daemon che guardare l'output del registro
  • È possibile utilizzare grep ... <<<"$line" per eseguire un minor numero di echo s.
  • È possibile utilizzare tail -f | grep -q ... per evitare il ciclo while interrompendolo non appena è presente una riga corrispondente.
  • Se è possibile evitare -i su grep potrebbe essere notevolmente più veloce per elaborare l'input.
  • Thou shalt not kill -9.
Problemi correlati