Das Skript wird manuell ausgeführt, jedoch nicht von Cron

Das Skript wird manuell ausgeführt, jedoch nicht von Cron

Gemäß der Überwachung meines MySQL-Replikationsstatus habe ich ein einfaches Shell-Skript mit dem folgenden Code geschrieben

#!/bin/bash
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < /tmp/mysql_repl_status.txt

Das Problem ist, dass das Skript einwandfrei funktioniert, wenn ich es manuell ausführe, mit Cron funktioniert es jedoch nicht.

Beim Verwenden von cron wurde nur die E-Mail mit der Ausgabe des Datumsbefehls erhalten. Was ist auf meiner Seite falsch?

Antwort1

Mehrere Möglichkeiten:

  1. Cron übergibt keine vollständige Benutzerumgebung an Skripte, die unter Cron ausgeführt werden. Daher können Variablen wie $PATH unter Cron anders sein als in einem Benutzerterminal.

  2. Cron erfordert am Ende jeder Zeile eine neue Zeile. Lassen Sie daher am Ende der Crontab-Datei immer eine Leerzeile.


Geben Sie im Skript möglicherweise die vollständigen Pfade an und prüfen Sie, ob das zunächst funktioniert.

#!/bin/bash
statfile=/tmp/mysql_repl_status.txt
/bin/date > $statfile
cd /usr/bin
/usr/bin/mysql -e "SHOW SLAVE STATUS \G" >> $statfile
/bin/mail -s "Netspective MySQL Replication Status" [email protected] < $statfile

Antwort2

Cron-Jobs werden mit sehr wenig Kontext ausgeführt. Wenn Sie eine .my.cnfDatei in Ihrem Home-Verzeichnis haben, könnte diese die Authentifizierungsdetails enthalten, die für die mysqlAusführung des Befehls erforderlich sind. Sie benötigen wahrscheinlich auch den vollständigen Pfad mail– sehen Sie, was which mailausgegeben wird.

Antwort3

Anstatt den vollständigen Pfad für jeden Befehl anzugeben, wäre es hilfreich, PATHdie Variable in der Skriptdatei selbst festzulegen.

#!/bin/bash
export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < 
/tmp/mysql_repl_status.txt`

Antwort4

verwendenbash -l -c

z.B:

* * * * * bash -l -c '/dsds/fddfd/something.sh' > /tmp/something.log

verwandte Informationen