Toon posts:

Bash script vraagje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

Ik draai een applicatie op mijn Linux server die nog wel eens de neiging heeft om zichzelf te laten hangen wanneer er teveel mail processen op de achtergrond draaien. Na het uitvoeren van het mail commando wordt dit proces niet altijd goed verwijderd. Wanneer ik op de console alle mailprocessen opvraag met:

[root@linux]# ps -ef | grep mail

Dan krijg ik soms wel een lijst van 30 mail processen (en hangt de applicatie dus). Nu heb ik onderstaand script die ik in een cronjob elk uur laat uitvoeren.
code:
1
2
3
4
5
echo "Alle mail processen worden gekilled..."
killall mail
killall -9 mail
echo ""
echo "Done!"

Dit werkt perfect. Alleen is het op deze manier mogelijk dat er mail processen gekilled worden die nog niet verzonden zijn. Dus als er bijvoorbeeld op hetzelfde tijdstip een mail wordt gestuurd en de cronjob wordt ook uitgevoerd dan komt de mail nooit aan.

Ik zat te denken om het cronjob script uit te breiden door het te laten controleren hoelang een mailproces al draait. Alleen is nu de vraag hoe ik dat voor elkaar krijg op deze manier. Wanneer een mailproces bijvoorbeeld langer dan 5 minuten aanwezig is mag hij worden verwijderd.

Is het mogelijk om dit in mijn bash script te verwerken of zijn hier andere (betere) oplossingen voor mogelijk?

Thanx!

Verwijderd

Nou, met awk moet wel het een en ander kunnen:
code:
1
 ps -aef | awk '/mail/ {print $5}'
Zo kun je zien wanneer een mail-proces is gestart. Met wat elementaire bash skillz moet je toch hier mee verder kunnen.

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 22-01 12:46
Als je ps de proceslijst opvraagt, kun je met awk vrij eenvoudig een bepaalde kolom laten printen, waarmee je weer vergelijkingen kunt doen...

uit mijn hoofd iets van:
code:
1
ps auxww | grep mail | awk '{print $6}'


Waarbij 6 de kolom is die je moet hebben ...
Zoeken op awk tutorial en bash tutorial moet je verder een heel eind op weg helpen denk ik :)

Verwijderd

Is het niet een betere optie om te zorgen dat die processen niet meer vastlopen? Wat je nu doet is symptoombestrijding, maar je laat het probleem zitten.

Om welke mailapp gaat het?

Verwijderd

Topicstarter
Verwijderd schreef op 25 June 2003 @ 16:04:
Is het niet een betere optie om te zorgen dat die processen niet meer vastlopen? Wat je nu doet is symptoombestrijding, maar je laat het probleem zitten.

Om welke mailapp gaat het?
Uiteraard is dat de beste oplossing, maar dat zie ik zo 1-2-3 even niet zitten aangezien de applicatie niet door mijzelf ontwikkeld is. Het is een open source netwerk monitoring systeem trouwens, OpenNMS.

Dit is voor nu de beste oplossing lijkt mij.

Verwijderd

Topicstarter
ThaRups schreef op 25 juni 2003 @ 16:03:
Als je ps de proceslijst opvraagt, kun je met awk vrij eenvoudig een bepaalde kolom laten printen, waarmee je weer vergelijkingen kunt doen...

uit mijn hoofd iets van:
code:
1
ps auxww | grep mail | awk '{print $6}'


Waarbij 6 de kolom is die je moet hebben ...
Zoeken op awk tutorial en bash tutorial moet je verder een heel eind op weg helpen denk ik :)
Allebei bedankt voor de awk tips, wist het gebruik ervan nog niet ;)... Ik ga weer aan de slag!

  • Wirf
  • Registratie: April 2000
  • Laatst online: 01-05 15:51
anders neem je eerst de lijst met alle mailprocessen, neemt daar de PID's uit, wacht dan uuh... een minuut ofzo voordat je begint met killen.
Op die manier kill je altijd alleen processen die ouder zijn dan 1 minuut.

Heeft sinds kort zijn wachtwoord weer terug gevonden!


Verwijderd

Topicstarter
Wirf schreef op 25 June 2003 @ 16:22:
anders neem je eerst de lijst met alle mailprocessen, neemt daar de PID's uit, wacht dan uuh... een minuut ofzo voordat je begint met killen.
Op die manier kill je altijd alleen processen die ouder zijn dan 1 minuut.
Ja, maar hoe zou je dat aanpakken dan? Ik zou niet zo snel weten hoe ik dit in een bash scriptje kan realiseren. Ik stel me voor: alle gevonden PID´s in een array zetten, een sleep van 120 seconden inbouwen en dan alle PID´s die in de array staan killen???? En nu in de praktijk....

  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

zonder alles voor te willen kauwen:
code:
1
2
3
I=`ps auxww | grep mail | awk '{print $6}'`
echo blaat
for J in $I ; do echo $J; done

Whenever you find that you are on the side of the majority, it is time to reform.


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:14
Over welke kolom hebben jullie het nu precies dan? Als ik ps auxww doe krijg ik deze kolommen:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

TIME niet de hoeveelheid tijd die het programma heeft gedraaid, maar de hoeveelheid tijd in minuten die het programma aan CPU-tijd heeft gekregen. Helaas gebruiken hangende programma's vaak helemaal geen CPU-tijd (omdat ze in een deadlock-toestand zitten), dus met dat veld vindt je ze alsnog niet.
Het vakje "START" bevat de tijd (in HH:MM formaat) dat het proces is gestart. Hier moet wel iets mee te doen zijn:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for regel in `ps auxww | grep "[m]ail" | awk '{print $2","$9}'`; do
  pid=`echo $regel | cut -d, -f1`
  tijd=`echo $regel | cut -d, -f2`
  nu=`date +%s`
  toen=`date -d "today $tijd" +%s`
  verschil=$[nu-toen]
  if [ $verschil -gt 120 ]; then
    echo "Proces $pid gaat nu dood; deze draaide al $verschil seconden"
    kill $pid
    sleep 2
    kill -9 $pid
  fi
done


Dat getal 120 is natuurlijk het aantal seconden hoe oud een proces moet zijn wil het in aanmerking komen om gekilld te worden.

Vertel me nu eens deze twee dingen: waarom er grep "[m]ail" ipv grep "mail" staat, en waarom dit script juist rond 12 uur 's nachts niet werkt (je kunt het dan wel draaien maar het doet als je het draait tussen 0:00 en 0:02 gewoon niets, bedenk maar waarom :) ), en hoe je dit evt. nog zou kunnen oplossen mag je zelf bedenken (het kan prima hoor! :P ).

[ Voor 7% gewijzigd door Wilke op 25-06-2003 20:37 ]


Verwijderd

Eigenlijk zou ik het zelf op de manier van de generaal (25-6 16:04) willen oplossen, maar ik kan hier niet zien wat er op je pc gebeurt...
Maar deze symptoombestrijder doet het perfect:

code:
1
ps -ef | grep [m]ail | awk '{print "kill "$2 " 2>/dev/null;sleep 2;kill -9 "$2 " 2>/dev/null"}' >>scriptje;chmod +x scriptje;sleep 120;./scriptje;rm scriptje


Bij dit scriptje maakt het niet uit hoe laat het is, het killed gewoon de processen "mail", welke na 2 minuten nog draaien, en dat is precies wat je moet hebben...

[ Voor 10% gewijzigd door Verwijderd op 25-06-2003 22:54 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:14
Verwijderd schreef op 25 June 2003 @ 22:52:
Bij dit scriptje maakt het niet uit hoe laat het is, het killed gewoon de processen "mail", welke na 2 minuten nog draaien, en dat is precies wat je moet hebben...
Niet precies; het killt na 2 minuten later processen die het PID hebben dat 2 minuten eerder gebruikt werd door toen lopende mail-processen.

Nu gaat dat gewoonlijk wel prima natuurlijk (of er moeten heel veel processen voorbij zijn gekomen in die tijd, of het doortel-algoritme voor PID's in Linux moet ooit veranderd worden), maar in principe is er dus niets dat garandeert dat 2 minuten later hetzelfde PID ook nog steeds door datzelfde proces gebruikt wordt.

Linux gebruikt dacht ik een 16-bits tellertje, dus na 65535 processen is de teller rond. Weinig kans dat dat in 2 minuten lukt, op de meeste systemen :)

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Wilke schreef op 25 June 2003 @ 23:16:
[...]


Linux gebruikt dacht ik een 16-bits tellertje, dus na 65535 processen is de teller rond. Weinig kans dat dat in 2 minuten lukt, op de meeste systemen :)
Nope, volgens mij niet. Voor zover ik weet heeft de hoogst mogelijke pid te maken met de hoeveelheid geheugen die je hebt (dat is mij eens verteld). Het is in ieder geval geen 16bit teller, hij wrapt hier bij ongeveer 30k.

Verwijderd

ik ging er vanuit dat er niet in 2 minuten 32768 nieuwe processen zouden worden gestart, als dat wel zou gebeuren, zou je idd in de problemen komen...

15 bits dus.... :)
Pagina: 1