probleem met variabele in script in crontab

Pagina: 1
Acties:

  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
Ik heb een probleem met een scriptje.. Scriptje draait wel onder mijn shell, maar geeft problemen onder cron.

Betreft hier een FreeBSD 7.2 doos, mijn shell is bash. Het betrof hier een wat groter script, maar ik heb mijn probleem teruggebracht tot een script met 3 regeltjes.

Het script:
code:
1
2
3
#!/bin/sh
MYSQL=`/usr/bin/which mysql`
echo "--> $MYSQL <--"


Het script draait prima als ik het interactief in mijn shell (bash) draai. Ja, ik draai onder root, daar draait het script ook onder in crontab.

code:
1
2
[root@hostname ~]# ./test.sh
--> /usr/local/bin/mysql <--

Ook als ik het script met sh aanroep, zie ik hetzelfde:
code:
1
2
[root@hostname ~]# sh test.sh
--> /usr/local/bin/mysql <--


Als ik echter het scriptje via cron aanroep:
code:
1
2
[root@nmt-ded-01 ~]# cat /etc/crontab | grep test.sh
*/5      *       *       *       *       root    /root/test.sh


Dan krijg ik een mailtje terug met in de content enkel:
code:
1
-->  <--

Iemand enig idee waarom die variabele leeg blijft?

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!


  • Mijzelf
  • Registratie: September 2004
  • Niet online
Meest voor de hand liggend is dat mysql niet in het zoekpad zit. Dat zou je kunnen testen door de regel
MYSQL=`/usr/bin/which mysql`
te vervangen door
MYSQL=`mysql --version`
oid

Verwijderd

gewone text in een variabele steken werkt dat wel?
Probeer dit script eens:
#!/bin/sh
MYSQL="/usr/local/bin/mysql"
echo MYSQL: $MYSQL
echo which mysql: `which mysql`

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 27-01 18:27

Kees

Serveradmin / BOFH / DoC
Wat als je $PATH laat afdrukken?

En nadat je gezien hebt dat die variable leeg is (of in ieder geval onvolledig):
which returns the pathnames of the files which would be executed in the
current environment, had its arguments been given as commands in a
strictly POSIX-conformant shell. It does this by searching the PATH
for executable files matching the names of the arguments.
Emphasis mine.

Dus hoe kun je dat oplossen?
Vollediger environment meegeven door bijvoorbeeld:
- source /etc/profile
- export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" in je script
- In /etc/crontab: PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

En natuurlijk kun je ook de 'which' vervangen door het volledige path naar de executable die je al krijgt, maar dat is inderdaad iets minder flexibel dan de bovengenoemde paden te doorzoeken.

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
Nou ja, bovenaan in mijn crontab staat
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

En daar moet ik natuurlijk ook de local paden toevoegen.. duh..

Bedankt voor het meedenken allen..

(En dan te bedenken dat ik toch al een tijdje aan het googlen was op problemen met backticks, bash. sh problemen, etc :) )

[ Voor 29% gewijzigd door axis op 07-10-2009 13:17 ]

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!