Toon posts:

crontab + if-constructies in script?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Zit met een klein probleempje: ik heb een aantal bash-scripts met if-constructies in die niet werken in crontab.

Als ik ze manueel uitvoer, werken ze perfect. In crontab lijkt het alsof de if-constructie gewoon niet geëvalueerd wordt. Al een aantal testen gedaan met echoën van variabelen, die zijn OK. Hetgeen tussen de if staat wordt gewoon niet gedaan in crontab (of de if zelf wordt misschien ook al geskipt).

Voorbeel uit één van de scripts:

DISK=$(df -h /dev/da0s1a | cut -c 40-41 | tail -1)
echo $DISK
if [[ $DISK > 90 ]]; then
echo "" | /usr/local/bin/mutt -F /root/.muttrc -s "/ passed 90% disk space!" adres@domein.be
fi

Weet er iemand wat het probleem kan zijn? Is er iets speciaals met if in bash-scripts via crontab? Google leert mij alvast niet veel bij.

  • SpamLame
  • Registratie: Augustus 2000
  • Laatst online: 27-01 07:54

SpamLame

niks

; voor then weghalen al geprobeerd?

Verwijderd

Topicstarter
En zoals dat meestal gaat, na uren zoeken en uiteindelijk toch maar hulp zoeken, de oplossing zelf vinden:

[ "$DISK" -gt "90" ]

Syntax was gewoon verkeerd :)

Verwijderd

Je hebt wel een shebang boven aan het script?

e.g.
code:
1
#!/bin/sh

Verwijderd

Topicstarter
Ook vergeten, maar het werkte wel zonder. Even toegevoegd ;)

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 28-01 16:23

deadinspace

The what goes where now?

Hoi Zloevke, welkom op GoT :)

Ik heb ook nog een vraag: Hoe riep je het script aan vanuit cron, en hoe vanaf de commandline?

Het is het handigst als je probeert dit soort informatie zoveel mogelijk in de topicstart op te nemen. Bijvoorbeeld door het hele script in de topicstart te zetten (mits het niet heel lang is), en door de crontab regel letterlijk te noemen.

Ook is het wat leesbaarder als je stukken script in [code][/code] of [cmd][/cmd] tags plaatst ;)

Verwijderd

Topicstarter
Hehe, zal er aan proberen denken.

Ben nu bezig aan een ander script, en Bash scripts in crontab is toch wel een vreemd zaakje hoor. Nu zit ik met een variable increment die ik op geen enkele manier aan de gang krijg in crontab. Als ik het script manueel uitvoer, werkt het wel.

count=$count+1 -> 1, 1+1, 1+1+1, ...
count+=1 -> 1, 11, 111, ...
count += 1 -> 1, 1, 1, ...

Ik snap er niets van :)
Bedoeling is dus om gewoon 1, 2, 3, ... te krijgen.

Het script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/local/bin/bash
echo "use xyz" >> /xyz/scripts/tmp_queries
echo "select x from y where conditie;" >> /xyz/scripts/tmp_queries
result=`/usr/local/bin/mysql -u user -ppassword < /xyz/scripts/tmp_queries`

count=1
for userid in $result
do
        if [ "$count" -ne "1" ]; then
                rm -rf /directory/$userid
        fi
        count+=1
done

echo > /xyz/scripts/tmp_queries

echo "use xyz" >> /xyz/scripts/tmp_queries
echo "delete from x where condition;" >> /xyz/scripts/tmp_queries
/usr/local/bin/mysql -u user -ppassword < /xyz/scripts/tmp_queries

rm -rf /xyz/scripts/tmp_queries


Als ik dit script manueel uitvoer:

/xyz/scripts/script


werkt het perfect. In crontab dus niet.

code:
1
42 10 * * * /xyz/scripts/script


Momenteel draait het script dus gewoon met "count+=1". Het enige dat van belang is dat er iets uitgevoerd wordt van zodra count niet meer gelijk is aan 1, maar zou toch willen weten waarom crontab zo moeilijk doet :)

[ Voor 7% gewijzigd door Verwijderd op 14-08-2008 10:48 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op donderdag 14 augustus 2008 @ 10:47:
code:
1
2
3
4
#!/usr/local/bin/bash
echo "use xyz" >> /xyz/scripts/tmp_queries
echo "select x from y where conditie;" >> /xyz/scripts/tmp_queries
result=`/usr/local/bin/mysql -u user -ppassword < /xyz/scripts/tmp_queries`
offtopic:

Even een kleine tip, je hoeft niet "USE xyz" te doen als je in je sessie slechts 1 db wilt benaderen, je kan die gewoon aan het mysql commando meegeven:

Usage: mysql [OPTIONS] [database]


Dus:
code:
1
2
echo "select x from y where conditie;" >> /xyz/scripts/tmp_queries
result=`/usr/local/bin/mysql -u user -ppassword xyz< /xyz/scripts/tmp_queries`


Sterker nog, als je slechts 1 query wilt uitvoeren kan dat nog veel handiger:
code:
1
result=`/usr/local/bin/mysql -u user -ppassword -e "select x from y where conditie" xyz`

  • sparks
  • Registratie: December 2002
  • Laatst online: 08:33
Misschien een handige tip, neem in je script deze statements op:

set -x
exec 2> /tmp/`basename $0`

bij elke keer dat het uitgevoerd wordt krijg je dus 'debug' informatie in /tmp. Kun je waarschijnlijk makkelijk achterhalen wat er fout gaat.

Op unix systemen moet je altijd rekening houden met het feit dat crontab alles met een sh uitvoert terwijl de meeste mensen met ksh werken. Daarom is het verstandig om de she bang naar bash op te nemen.

Succes,

Verwijderd

Verwijderd schreef op donderdag 14 augustus 2008 @ 10:47:
Het script:

code:
1
2
3
4
5
6
#!/usr/local/bin/bash
echo "use xyz" >> /xyz/scripts/tmp_queries
echo "select x from y where conditie;" >> /xyz/scripts/tmp_queries
result=`/usr/local/bin/mysql -u user -ppassword < /xyz/scripts/tmp_queries`

....
De volgende shebang werkt ook op andere machine's.
code:
1
#!/usr/bin/env bash
Als ik dit script manueel uitvoer:

/xyz/scripts/script


werkt het perfect. In crontab dus niet.

code:
1
42 10 * * * /xyz/scripts/script


Momenteel draait het script dus gewoon met "count+=1". Het enige dat van belang is dat er iets uitgevoerd wordt van zodra count niet meer gelijk is aan 1, maar zou toch willen weten waarom crontab zo moeilijk doet :)
In een script taal zoals perl of python is het veel makkelijker en duidelijker om met mysql te werken. En die kan je ook aanroepen vanuit cron.
sparks schreef op donderdag 14 augustus 2008 @ 11:53:
Op unix systemen moet je altijd rekening houden met het feit dat crontab alles met een sh uitvoert terwijl de meeste mensen met ksh werken. Daarom is het verstandig om de she bang naar bash op te nemen.
Als je het script portable wilt maken is het veel handiger om het script sh compatible te maken zodat het werkt met de sh clones die je wilt gebruiken.

Verwijderd

probeer eens

count=`expr $count + 1`

ipv

count+=1

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 09:56

Super_ik

haklust!

Verwijderd schreef op donderdag 14 augustus 2008 @ 14:03:
probeer eens

count=`expr $count + 1`

ipv

count+=1
of
let count+=1

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek

Pagina: 1