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:
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.
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.cnf
Datei in Ihrem Home-Verzeichnis haben, könnte diese die Authentifizierungsdetails enthalten, die für die mysql
Ausführung des Befehls erforderlich sind. Sie benötigen wahrscheinlich auch den vollständigen Pfad mail
– sehen Sie, was which mail
ausgegeben wird.
Antwort3
Anstatt den vollständigen Pfad für jeden Befehl anzugeben, wäre es hilfreich, PATH
die 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