cmd. moet vergelijken, geen bestand schijven....

Pagina: 1
Acties:

  • Whizzer
  • Registratie: November 2000
  • Laatst online: 16-08 21:58
Daar is ik weer (in goed nederlands),

Naar aanleiding van wat volle schijf perikelen ben ik een klein scriptje aan het bakken dat kijkt hoe vol de schijven zijn en als ze voller zijn dan 89%, dan moet ie mij een mailtje sturen.

Tot nu toe heb ik het volgende gebakken:
code:
1
2
3
4
5
6
7
8
#!/bin/sh
if [ "df -k | grep /dev | awk {'print$5'} | sed s/%//" > 89 ] ; then
      cp -f mailheader /tmp/diskusage
      df -k >> /tmp/diskusage
      cat mailfooter >> /tmp/diskusage
      cat /tmp/diskusage | mail -s "Disk Usage Problem on `hostname` " email@adres.nl
      rm -f /tmp/diskusage
      fi

Het is natuurlijk niet de mooiste manier van programeren, maarja, ik probeer dit ook allemaal pas sinds kort...

Het probleem is nu het stukje '> 89'... Dat maakt een bestandje aan '89' i.p.v. het te vergelijken met dit getal en mailt altijd de uitslag, dus ook als ie maar 20% vol zit.

Op zich begrijp ik wel waarom ie het bestandje '89' aan maakt, maar ik vraag me af hoe ik 'm voor elkaar kan laten krijgen dat ie de waarde vergkregen uit het commando daarmee vergelijkt.

Ik heb dat stukje trouwens uit een scriptje waar een waarde werd vergeleken met 0, dat deden ze met behulp van != 0 op de plaats waar nu '> 89' staat...

Die mailheader en mailfooter zorgen ervoor dat het een netjes mailtje wordt. Mochten mensen trouwens ideeën hebben om het scriptje te verbeteren, kom maar op...

Wie weet de geweldige oplossing???

Ik ben geweldig.. en bescheiden! En dat siert me...


Verwijderd

Probeer het eens door die > te escapen (backslashje ervoor):

if [ "df -k | grep /dev | awk {'print$5'} | sed s/%//" \> 89 ] ; then

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 17-08 22:47
Of >= ipv >? Weet het niet zeker hoor..

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Kijken (in bash) of iets groter is gaat met -gt

-gt greater then
-lt less then
-eq equal
-ne not equal
code:
1
2
3
if [ $freespace -gt 89 ]; then
email();
fi

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Whizzer
  • Registratie: November 2000
  • Laatst online: 16-08 21:58
Brakker programmeren dan dit gaat haast niet, maar het werkt op de volgende manier wel:
code:
1
2
3
4
5
6
7
8
#!/bin/bash
if [ `df -k | grep /dev | awk {'print$5'} | sed s/%//` -gt 89 ] ; then
      cp -f mailheader /tmp/diskusage
      df -k >> /tmp/diskusage
      cat mailfooter >> /tmp/diskusage
      cat /tmp/diskusage | mail -s "Disk Usage Problem on `hostname` " email@adres.nl
      rm -f /tmp/diskusage
      fi

Het was inderdaad op te lossen met -qt is bash... Maar ook de " na if [ moesten een ` worden...

Als iemand verbeteringen heeft, graag en anders hoop ik dat er nog anderen zijn die hier ook iets aan hebben...

Ik ben geweldig.. en bescheiden! En dat siert me...


  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Op vrijdag 09 november 2001 23:12 schreef Whizzer het volgende:
cp -f mailheader /tmp/diskusage
Dit is een erg gevaarlijke manier van het gebruik van tmp-files. Een verbetering zou zijn om een tmp-file met mktemp een file aan te maken. (man mktemp laat een voorbeeld zien)

Nog beter zou zijn als je alles wat je uiteindelijk wilt mailen gewoon even in het geheugen zou zetten.
code:
1
2
3
HEADER=`cat mailheader`
FOOTER=`cat mailfooter`
echo -e "$HEADER\n$FOOTER" | mail ....blablabal

Scheelt ook weer diskaccess enzo.

Hiermee "df -k | grep /dev | awk '{printf("%i", $5)}'" kan je nog het opstarten van een extra process besparen.

Gebruik trouwens ook iets als "df -k /dev/hdXX" of "df -k /var/spool/mail". Anders gaat het ooit mis als je meerdere schijven of partities in je machine krijgt.

  • Whizzer
  • Registratie: November 2000
  • Laatst online: 16-08 21:58
Op zaterdag 10 november 2001 02:16 schreef little_soundman het volgende:

Dit is een erg gevaarlijke manier van het gebruik van tmp-files. Een verbetering zou zijn om een tmp-file met mktemp een file aan te maken. (man mktemp laat een voorbeeld zien)
Het probleem is dat dit niet alleen op mijn linux-doos, maar ook op een Unix (Solaris) machine moet komen te draaien. Deze kent het commando 'mktemp' niet. Daar is het een functie.
Nog beter zou zijn als je alles wat je uiteindelijk wilt mailen gewoon even in het geheugen zou zetten.
code:
1
2
3
HEADER=`cat mailheader`
FOOTER=`cat mailfooter`
echo -e "$HEADER\n$FOOTER" | mail ....blablabal

Scheelt ook weer diskaccess enzo.

Hiermee "df -k | grep /dev | awk '{printf("%i", $5)}'" kan je nog het opstarten van een extra process besparen.
Was ik ook al aan het proberen, maar ik kom hier een beetje m'n programmeer tekorten ( :? ) tegen... Tusen $Header\ en $FOOTER moet eens 'df -k' verschijnen...
Gebruik trouwens ook iets als "df -k /dev/hdXX" of "df -k /var/spool/mail". Anders gaat het ooit mis als je meerdere schijven of partities in je machine krijgt.
Dat is een goeie, had ik even niet aan gedacht, heb thuis ook meer dan 1 partitie, maar deed voor de test ook een 'grep /dev/hda' i.p.v. 'grep /div'. Dit is inmiddels al opgelost.

Ben benieuwd naar de volgende tips, alvast bedankt i.i.g.

Ik ben geweldig.. en bescheiden! En dat siert me...


  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Op zaterdag 10 november 2001 13:42 schreef Whizzer het volgende:

Was ik ook al aan het proberen, maar ik kom hier een beetje m'n programmeer tekorten ( :? ) tegen... Tusen $Header\ en $FOOTER moet eens 'df -k' verschijnen...
code:
1
2
3
4
5
6
7
HEADER=`cat mailheader`
DFOUT=`df -k`
FOOTER=`cat mailfooter`
if [ `df -h /dev/hda1 | grep /dev/hda | awk '{printf("%i", $5)}'` -gt 89 ]
then
   echo -e "$HEADER\n$DFOUT\n$FOOTER" | mail ....blablabal
fi

  • jeroen|IA
  • Registratie: Juni 1999
  • Laatst online: 26-05-2025
Alles binnen Awk halen kan ook:

df -k | awk '/dev/ {gsub("%", ""); if ($5 > 89) { print $5}}'

Maar ik vond die oplossing met printf("%i" ,$5) ook wel mooi, alleen kun je die waarde dan niet meer gebruiken voor een if. Je zou ook nog naar Perl kunnen uitstappen, die kent constructies van de vorm: print - if

Leuk, scripten :)

  • Whizzer
  • Registratie: November 2000
  • Laatst online: 16-08 21:58
Op zaterdag 10 november 2001 14:09 schreef little_soundman het volgende:
code:
1
2
3
4
5
6
7
HEADER=`cat mailheader`
DFOUT=`df -k`
FOOTER=`cat mailfooter`
if [ `df -h /dev/hda1 | grep /dev/hda | awk '{printf("%i", $5)}'` -gt 89 ]
then
   echo -e "$HEADER\n$DFOUT\n$FOOTER" | mail ....blablabal
fi
|:( Dom, dat had ik zelf nog wel moeten kunnen bedenken...

Ik ben geweldig.. en bescheiden! En dat siert me...


  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 12:52

odysseus

Debian GNU/Linux Sid

code:
1
2
3
#!/usr/bin/perl
@var = (`df -h` =~ /\d{2,3}(?=%)/g);
`mailopdracht` if ($var[0] > 89);

Als iemand em zonder die array kan, is het helemaal mooi ;)

* odysseus still loves regexps...

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.

Pagina: 1