PDA

Bekijk Volledige Versie : Cron-probleem



IT-worX
07/09/14, 02:39
Beste WHT'ers,

Eerste poging voor iets geautomatiseerd te laten verlopen via cron...en uiteraard...fail! Echter geen idee waar het zit (logs zeggen niks)

1. Het script is vrij simpel, alle regels apart werken
2. nadat het script is aangemaakt, is het uitvoerbaar gemaakt (chmod +x bestand.sh)
3. als ik het script manueel uitvoer, komt het wel goed?

Wat het script moet doen:
1. elke 5 minuten het bestand "config.txt" downloaden van http://config.smokeping.me/config.txt
2. bestand "config.txt" verplaatsen (+hernoemen) naar /opt/smokeping/etc/config
3. smokeping herstarten

Het script zelf


#!/bin/bash

echo "*** Download of the current Smokeping configuration file ***"
wget -O config.txt http://config.smokeping.me/config.txt

echo "*** Move downloaded config file to Smokeping directory ***"
mv config.txt /opt/smokeping/etc/config

echo "*** Restart Smokeping ***"
service smokeping restart



manueel uitvoeren van het script


[root@v02 /]# sh /home/smokepingme.sh
*** Download of the current Smokeping configuration file ***
--2014-09-07 02:34:27-- http://config.smokeping.me/config.txt
Herleiden van config.smokeping.me... 85.234.197.11
Verbinding maken met config.smokeping.me|85.234.197.11|:80... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 8381 (8,2K) [text/plain]
Wordt geschreven naar: `config.txt'

100%[======================================>] 8.381 --.-K/s in 0,005s

2014-09-07 02:34:27 (1,67 MB/s) - '`config.txt'' opgeslagen [8381/8381]

*** Move downloaded config file to Smokeping directory ***
*** Restart Smokeping ***
Stopping SMOKEPING: [ OK ]
Starting SMOKEPING: WARNING: Hostname 'test.krisa.be' does currently not resolve to an IPv6 or IPv4 address
Note: logging to syslog as local0/info.
Daemonizing /opt/smokeping/bin/smokeping ...
[ OK ]


Rechten


[root@v02 home]# ls -ll
totaal 20
-rwxrwxrwx. 1 root root 0 sep 7 02:23 cronlog.log
drwx------. 2 root root 16384 sep 6 17:57 lost+found
-rwxr-xr-x. 1 root root 305 sep 7 01:43 smokepingme.sh


Crontab -e


*/5 * * * * sh /home/smokepingme.sh >> /home/cronlog.log 2>&1

Paul Z.
07/09/14, 04:11
Als je een cron job gebruikt, dan wordt over het algemeen het search path niet goed gezet. Dus als je een commando gebruikt dan moet je gewoon het gehele pad gebruiken... Bijvoorbeeld i.p.v. "ls" "/bin/ls" ...
In jouw geval dus "wget", "mv" en "service" het gehele pad geven... Je kan uiteraard ook gewoon een search path definieren... ;-)

IT-worX
07/09/14, 13:14
Dag Paul,

Maar hoe komt het dan dat het script wel werkt als ik het handmatig uitvoer (sh smokepingme.sh)? Zie mijn eerste post.

visser
07/09/14, 13:18
Dag Paul,

Maar hoe komt het dan dat het script wel werkt als ik het handmatig uitvoer (sh smokepingme.sh)? Zie mijn eerste post.

Waarschijnlijk omdat jij in je shell een PATH hebt met alle paden waar programma's gevonden kunnen worden.

Zet in het cron script bij

echo $PATH >>/tmp/show_path.txt

En kijk naar het verschil als je het met de hand of door cron laat uitvoeren.

IT-worX
07/09/14, 13:34
Ik *DENK* dat de fout zit bij het aanroepen van de cron : er gebeurd namelijk niks.
Op jouw aanraden heb ik "echo $PATH >>/tmp/show_path.txt" er onderaan bijgezet en heb de cron voor alle gemakkelijkheid van 5 naar 1 minuut gezet. Via de cron zelf : noppes. Als ik het handmatig uitvoer heb ik bij /tmp/show_path.txt het volgende



[root@v02 home]# cat /tmp/show_path.txt
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


Crontab heb ik inmiddels ook aangepast naar het volgende (zonder dat het werkt):


*/1 * * * * ./home/smokepingme.sh

visser
07/09/14, 13:40
Ik *DENK* dat de fout zit bij het aanroepen van de cron : er gebeurd namelijk niks.
Op jouw aanraden heb ik "echo $PATH >>/tmp/show_path.txt" er onderaan bijgezet en heb de cron voor alle gemakkelijkheid van 5 naar 1 minuut gezet. Via de cron zelf : noppes. Als ik het handmatig uitvoer heb ik bij /tmp/show_path.txt het volgende



[root@v02 home]# cat /tmp/show_path.txt
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


Crontab heb ik inmiddels ook aangepast naar het volgende (zonder dat het werkt):


*/1 * * * * ./home/smokepingme.sh


Hm, dat lijkt dan inderdaad in het uitvoeren door cron te zitten.

Ik zie trouwens weer de selinux . staan bij het shellscript.
Kijk daar eens naar ? (audit log, en of selinux op enforcing staat )

IT-worX
07/09/14, 14:05
Selinux staat op "disabled"

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted


Dus hoewel selinux op disabled staat, en setenforce 0 reeds is uitgevoerd, blijft dat puntje staan. Zonet voor de zekerheid alles gecontroleerd en nog maar eens een reboot gedaan, but without any luck

Intio
07/09/14, 15:06
Wat gebeurt er als je:

* * * * * /usr/bin/sh /home/smokepingme.sh

of

* * * * * bash /home/smokepingme.sh

visser
07/09/14, 15:10
Selinux staat op "disabled"


Dus hoewel selinux op disabled staat, en setenforce 0 reeds is uitgevoerd, blijft dat puntje staan. Zonet voor de zekerheid alles gecontroleerd en nog maar eens een reboot gedaan, but without any luck

Het puntje zegt niet of selinux actief staat, alleen dat er aan het bestand een acl hangt .
(je ziet die met ls -alZ /home/smokepingme.sh ) .

Kijk eens of de cron daemon uberhaupt draait ?
Zie je iets in /var/log/cron ?

IT-worX
07/09/14, 15:38
Wat gebeurt er als je:

* * * * * /usr/bin/sh /home/smokepingme.sh

of

* * * * * bash /home/smokepingme.sh

Probleem opgelost met het laatste!!!!!
Merci!

IT-worX
08/09/14, 16:10
Tis te zeggen...tis opgelost op 4 servers. 6 anderen (merk ik vandaag) snappen geen van onderstaande commando's:
- * * * * * bash /home/smokepingme.sh
- * * * * * sh /home/smokepingme.sh
- * * * * * ./home/smokepingme.sh

Voor ik de laatste optie probeer (* * * * * /usr/bin/sh /home/smokepingme.sh) had ik graag geweten of deze optie dan wel altijd werkt? Ik zoek namelijk één commando die ik op gelijk welke server kan gebruiken welke draait op CentOS 6.x (64 bit). Ik vind het bijvoorbeeld vrij bizar dat het manueel uitvoeren (./smokeping.sh of sh smokepingme.sh) wel steeds prima werkt (op alle servers!) maar in de vorm van een cronjob (waarvan het commando op 10 vps'en identiek is) niet.

Alle hulp steeds welkom, maar in n00b-taal :-)

Bedankt!!

Paul Z.
09/09/14, 00:16
Maak er eens "* * * * * /bin/bash /home/smokepingme.sh" van?

IT-worX
09/09/14, 00:55
Helaas is dat ook geen oplossing... :s

The-BosS
09/09/14, 00:59
Ik zou wel even een check inbouwen om te kijken of de gedownloade config wel nieuwer is dan de gebruikte config om nodeloze restarts te vermijden.

Iets in de zin van:


#!/bin/bash

URL="http://config.smokeping.me/config.txt"
TMP_FILE="/tmp/smokeping.config"
CONF_FILE="/opt/smokeping/etc/config"

echo -n "*** Download of the current Smokeping configuration file... "
/usr/bin/wget "$URL" -O $TMP_FILE -q
echo " [DONE]"

echo -n "*** Cheking if config is newer then installed config... "
MD5NEW=`/usr/bin/md5sum $TMP_FILE | /bin/awk {'print $1'}`
MD5CUR=`/usr/bin/md5sum $CONF_FILE | /bin/awk {'print $1'}`
echo " [DONE]"

if [ "$MD5NEW" == "$MD5CUR" ]; then
echo "*** Config file is already up-to-date, no action is required... [DONE]"
echo -n "*** Remove downloaded config file from tmp directory... "
/bin/rm -f $TMP_FILE
echo " [DONE]"
else
echo -n "*** Move downloaded config file to Smokeping directory... "
/bin/mv $TMP_FILE $CONF_FILE
echo " [DONE]"
/sbin/service smokeping restart
fi

Blacky
10/09/14, 18:55
* * * * * ./home/smokepingme.sh
Ik gebruik ook vaker zelf gemaakte .sh scriptjes, met een miniem verschilletje, een punt minder:

* * * * * /home/smokepingme.sh
En dat werkt bij mij altijd. Moet ik wel zeggen dat het altijd Centos machines zijn, vroeger Centos 5 en tegenwoordig Centos 6.5.

IT-worX
10/09/14, 23:06
The-Boss : een goed idee naar de toekomst toe, maar dit is nu (nog) niet aan de orde. Wil eerst die cron in orde krijgen. Zonder die cron ben je namelijk niet veel hé...

Blacky : deze truc werkt ook niet bij alles. Dat was namelijk mijn eerste idee :-)

visser
10/09/14, 23:17
The-Boss : een goed idee naar de toekomst toe, maar dit is nu (nog) niet aan de orde. Wil eerst die cron in orde krijgen. Zonder die cron ben je namelijk niet veel hé...

Blacky : deze truc werkt ook niet bij alles. Dat was namelijk mijn eerste idee :-)

Pak het eens systematisch aan, in plaats van een stel trucjes te proberen.
Een . voor een pad wil zeggen 'current directory' . Dat moet niet doen als je geen idee hebt wat voor het proces 'current directory' is.
Je doet dat als interactieve user, als je weet dat 'hier' je script staat.
Zorg eerst dat je weet of cron het script uitvoert.
Daarvoor kijk je in de logs . En roep vanuit de cron bijvoorbeeld een micro shell script /bin/bash /home/user/testcron.sh aan met
#!/bin/bash
date >>/tmp/cron_date.txt

Dan weet je of cron daemon draait en op deze manier scripts uitvoert.

cron kan gebruik maken van pam , dat kan een oorzaak zijn van het verschil tussen je servers.
(man crond )

Blacky
15/09/14, 00:33
Blacky : deze truc werkt ook niet bij alles. Dat was namelijk mijn eerste idee :-)
Ehmz... dat is geen truc, dat is een normale gang van zaken in een cron script.;)

t.bloo
15/09/14, 10:50
Niets zo simpel als het debuggen van een crontab toch? Als de cron loopt (zie logfile), de scripts lopen (zie touch file) en er geen fouten zijn (zie MAILTO) dan draait het en blijft het draaien. Tenminste, dat is bij mij altijd zo.