Bash valutazione sconcertante

Sto cercando di get uno script per fare qualcosa quando un numero è più grande di un altro, in questo caso, quando il livello di caricamento del sistema supera un valore definito.

Tutto ciò sta lavorando a parte i criteri di valutazione.

Mentre costruisco un altro server per alcuni siti, cerco di mantenere l'apache in linea, le ragioni non sono importnti, ma questo script è stato testato e testato in un sistema in cui la media di carico è inferiore a 15 e lo script viene printingto:

"il controllo è 4.68 e il massimo è 15.00" DESPIRE la condizione se non dice di non printingre niente affatto se il valore del controllo non è superiore al carico massimo, che non lo è.

Non sono un bash guru, ho una barba ma non sono sandali e ho provato diversi stili di parentesi e citando ma non riesco a capire perché questo script printing qualsiasi cosa quando $ check è inferiore a $ max_load .

Questo è su Debian 6, GNU bash, versione 4.1.5 (1) -release- (x86_64-pc-linux-gnu)

#!/bin/bash check=`cat /proc/loadavg | sed 's/./ /' | awk '{print $2}'` max_load='15.00'; high_load_log='/var/log/apache2/apache_high_load_restart.log'; apache_init='/etc/init.d/apache2'; if [[ $check > $max_load ]]; then echo " check is $check and max is $max_load"; #$apache_init stop sleep 5; #$apache_init restart echo "$(date) : Apache Restart due to load of | $check |" >> $high_load_log; fi 

Su un sistema con un carico di circa 4, questo script esegue:

 "check is 4.68 and max is 15.00" 

Qualcuno sa perché?

Qualsiasi aiuto e suggerimento per i sandali di buon avviamento sarebbero molto apprezzati!

  • spostare i file da un dispositivo all'altro
  • Dove è $ HOME impostato in Centos 6.3
  • Perché il mio tipo di ricerca è di eseguire fstat su each file di una cartella?
  • Equivalente Powershell di Ctrl + R?
  • eseguire script come utente che dispone di shell nologin
  • bash: "set -e" e verificare se esiste un utente esegue l'output script
  • Uno script di linea per controllare e reactjs all'utilizzo della memory
  • eseguire il command shell come altro utente chiamato da PHP
  • 4 Solutions collect form web for “Bash valutazione sconcertante”

    Questo non funziona. L'operatore all'interno di [[ confronta l' ordine di sorting , non il valore. Così….

     $ echo -e '4.68\n15.00'|sort 15.00 4.68 

    … perché 4 ordina dopo 1, il che significa che [[ 4.68 > 15.00 ]] è vero. E non puoi usare -gt , perché questo richiede interi.

    Se ti interessa solo le soglie di interi, questo è il corretto taglio – troncare il file . , usa -gt , e tu vai. Altrimenti, utilizza bc – vedere https://unix.stackexchange.com/questions/24721/how-to-compare-to-floating-point-number-in-a-shell-script

    Secondo i documenti, i < , e > sono un tipo lessicale . Non sono certo, ma sono abbastanza sicuro che questo sia lo stesso di quello che si otterrebbe se usaste qualcosa di simile. Con il sorting, 15.00 è prima del 4.68 perché essenzialmente ordina il carattere per carattere. Quindi 1 è prima di 4 nella maggior parte dei locali.

    Poiché il valore di esempio 4.68 dopo 15.0 ordinato in modo lessico, il > restituisce true.

    Hai quasi certamente voluto che le tue corde siano trattate come numbers in modo da utilizzare -gt o -lt , ma questi sono limitati a interi.

    Ref: http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html

    string1 <string2 Vero se string1 ordina prima della string 2 leksograficamente.

    string1> string2 True se string1 ordina dopo la string 2 leksograficamente.

    Grazie a tutti, la soluzione finale che funziona bene nel mio sistema Debian è stata questa, essenzialmente convertendola ad un int primo e poi utilizzando -gt.

     #!/bin/bash check=`cat /proc/loadavg | sed 's/ / /' | awk '{print $1}'` checkint=${check/\.*} max_load='20'; high_load_log='/var/log/apache2/apache_high_load_restart.log'; apache_init='/etc/init.d/apache2'; if [ $checkint -gt $max_load ]; then echo " check is $checkint and max is $max_load"; $apache_init stop sleep 5; $apache_init restart echo "$(date) : Apache Restart due to excessive load | $check |" >> $high_load_log; else echo "check is $check resolving down to $checkint and max is $max_load - No Action Taken"; fi 

    Il problema fondamentale è che Bash support solo aritmetica integer . Puoi lavorare in questo modo utilizzando uno strumento che support il punto a virgola mobile, che comodamente fa Awk.

    (Vorrei anche rilevare il cat inutile e notare che sed | awk è altrettanto inutile.)

     awk -v max="$max_load" '$1 > max { print "check is " $1 " and max is " max }' /proc/loadavg 

    Se si desidera utilizzare questo in un condizionale di shell, fare Awk restituire un codice di output zero per il successo, non zero sul guasto:

     if ! check=$(awk -v max="$max_load" '($1 > max) { print $1; exit 1 }' /proc/loadavg); then echo " check is $check and max is $max_load"; $apache_init stop sleep 5; $apache_init restart date +"%c : Apache Restart due to load of | $check |" >> $high_load_log; fi 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.