Bekijk Volledige Versie : Cron-probleem
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
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... ;-)
Dag Paul,
Maar hoe komt het dan dat het script wel werkt als ik het handmatig uitvoer (sh smokepingme.sh)? Zie mijn eerste post.
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.
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
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 )
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
Wat gebeurt er als je:
* * * * * /usr/bin/sh /home/smokepingme.sh
of
* * * * * bash /home/smokepingme.sh
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 ?
Wat gebeurt er als je:
* * * * * /usr/bin/sh /home/smokepingme.sh
of
* * * * * bash /home/smokepingme.sh
Probleem opgelost met het laatste!!!!!
Merci!
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!!
Maak er eens "* * * * * /bin/bash /home/smokepingme.sh" van?
Helaas is dat ook geen oplossing... :s
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
* * * * * ./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.
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 :-)
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 : 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.;)
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.