2012-11-21 10 views
0

J'ai un script shell Linux qui, lorsqu'il est exécuté à partir de la ligne de commande fonctionne parfaitement, mais lorsqu'il est programmé pour fonctionner via crontab, il ne donne pas les résultats souhaités.Le script shell ne fonctionne pas correctement

Le script est assez simple, il vérifie si mysql-proxy est en cours d'exécution ou pas en vérifiant si son pid est trouvé en utilisant la commande pidof. Si elle est désactivée, elle tente de démarrer le proxy.

# Check if mysql proxy is off 
# if found off, attempt to start it 

if pidof mysql-proxy 
then 
    echo "Proxy running." 
else 
    echo "Proxy off ... attempting to restart" 
    /usr/local/mysql-proxy/bin/mysql-proxy -P 172.20.10.196:3306 --daemon --proxy-backend-addresses=172.20.10.194 --proxy-backend-addresses=172.20.10.195 

    if pidof mysql-proxy 
    then 
     echo "Proxy started" 
    else 
     echo "Proxy restar failed" 
    fi 
fi 
echo "===============================================" 

Le script est enregistré dans un fichier check-sql-proxy.sh et dispose des autorisations définies à . Quand j'exécute le script depuis la ligne de commande (sh check-sql-proxy.sh), il donne la sortie désirée.

4066 
Proxy running. 
=============================================== 

Le script est également programmé pour exécuter toutes les 5 minutes à crontab comme

*/5 * * * * bash /root/auto-restart-mysql-proxy.sh > /dev/sql-proxy-restart-log.log 

Cependant, quand je vois le fichier sql-proxy-restart-log.log contient la sortie:

Proxy off ... attempting to restart 
Proxy restar failed 
=============================================== 

Il semble que pidof commande ne retourne pas le pid de l'application en cours d'exécution qui apporte le flux de l'écriture dans un état autre.

Je n'arrive pas à comprendre comment résoudre ce problème car lorsque je lance le script manuellement, cela fonctionne correctement. Est-ce que quelqu'un peut aider ce qui me manque en ce qui concerne les autorisations ou les paramètres?

Merci d'avance. Mudasser

+1

Les autorisations ne doivent pas être définies sur 777; Cela permet à n'importe qui d'éditer votre commande à tout moment.Pour faire tout ce que vous pouvez faire. Comme 'rm -fr/home/you'. –

Répondre

2

Vérifiez que la coquille est ce que vous pensez qu'il est (généralement/bin/sh, bash pas)

Vérifiez également que la variable d'environnement PATH. Habituellement, pour les tâches cron, il est recommandé de qualifier complètement tous les chemins vers les binaires, par ex.

#!/bin/bash 
# Check if mysql proxy is off 
# if found off, attempt to start it 

if /bin/pidof mysql-proxy 

etc.

+0

Merci pour votre aide. Faire des chemins entièrement qualifiés a résolu le problème. –

0

Essayez pidof/usr/local/mysql-proxy/bin/mysql-proxy (chemin complet vers l'exécutable)

En commun, essayez d'utiliser le même nom de commande comme cela a été utilisé pour démarrer l'instance de mysql-proxy.

0

Le problème semble que l'environnement crontab n'a pas le même environnement que vous.

Vous avez 2 solutions simples appropriées &:

Dans les premières lignes de crontab:

PATH=/foo:/bar:/qux 
SHELL=/bin/bash 

ou

source ~/.bashrc 

dans vos scripts.

+0

Addeed SHELL =/bin/bash pour 'crontab' –

Questions connexes