Unterdrücken Sie Warnmeldungen von MySQL im Shell-Skript, lassen Sie jedoch Fehler zu

10

Meine Protokolldateien werden mit der folgenden Meldung gesichert, während Shell-Skripte mit einigen zugrunde liegenden MySQL-Befehlen ausgeführt werden.

Hier ist die Nachricht:

"Warnung: Die Verwendung eines Kennworts auf der Befehlszeilenschnittstelle kann unsicher sein."

Um diese Nachrichten zu stoppen, verwende ich die folgende Jobdefinition.

Beispiel:

run_wrapper.sh |grep -v "Warning: Using a password" > output.log 2>&1

Dies hat funktioniert, aber die MySQL-Fehler werden nicht protokolliert output.log.

Wenn ich die Definition wie folgt ändere, werden gegebenenfalls MySQL-Fehler angezeigt

run_wrapper.sh > output.log 2>&1

Die Frage ist also, wie die Warnmeldungen unterdrückt und SQL-Fehler in Protokolldateien nur mit der Cron-Definition gemeldet werden können.

jagadisch puvvada
quelle
wahrscheinlich sollten Sie verwendenrun_wrapper.sh >> output.log 2>&1
Rahul
1
Ich folge nicht. Wohin sollen Fehler / Warnungen gehen und wohin soll die Ausgabe gehen, und was möchten Sie wegwerfen? Was generiert die Passwortwarnung und warum haben Sie Fehler in MySQL, die Sie nicht beheben möchten?
Kusalananda
1
mysql gibt diese Warnung aus, wenn Sie die -pOption in der Befehlszeile verwenden. Anstatt es zu reparieren (z. B. durch Erstellen einer ~/.my.cnfmit 600 Dauerwellen), möchte das OP die Warnung (und nur diese Warnung, nicht alle von stderr) einfach ignorieren und verwerfen
cas

Antworten:

25

Bearbeiten Sie es in Ihrem Bash-Skript oben

export MYSQL_PWD=yourdbpassword

und MySQL-Abfrage wie: mysql -u username -h host db -e "statement"

Referenz: Aus der Antwort bei Stackoverflow . Andere Antworten können ebenfalls verfolgt werden.

Gänseblümchen
quelle
2

Suchen Sie in Ihrem Wrapper nach einer Zeile ähnlich wie

mysql -u<username> -p<some_password> -hlocalhost -D<database_name> 

und wechseln zu

export MYSQL_PWD=<some_password> ; mysql -u<username> -hlocalhost -D<database_name> 

Dies löst die Quelle der Warnung.

Mockler
quelle
Das macht Sinn :-) Danke!
Mike Q
1

Es sieht so aus, als ob Ihnen die stderr- Umleitung von run_wrapper.shselbst fehlt , sodass die Fehler nicht durch grepund von dort in die Protokolldatei übertragen werden.

Versuchen Sie dies stattdessen, wenn Sie froh sind, dass sowohl stdout als auch sdterr in Ihre Protokolldatei geschrieben wurden

run_wrapper.sh 2>&1 | grep -v "Warning: Using a password" > output.log

Wenn Sie nur die Fehler in die Protokolldatei schreiben und stdout nicht mehr in das aufrufende Terminal schreiben möchten , versuchen Sie dies

( run_wrapper.sh 2>&1 1>&3 | grep -v "Warning: Using a password" > output.log ) 3>&1
Roaima
quelle
0

Versuche dies:

lf='output.log'
> "$lf"   # first truncate/create the logfile.
run_wrapper.sh >> "$lf" 2> >(grep -v "Warn.*passw.*insec" >> "$lf")

Leitet stderr über Process Substitution an um grep -v ...und die Ausgabe davon wird an >>to angehängtoutput.log

Sie wollen wahrscheinlich (GNU) verwenden , grep‚s - --line-bufferedOption sowie -vsicher Fehlerausgang verzögert wird nicht zu machen.


Wenn die Nachbearbeitung der Protokolldatei für Sie akzeptabel ist, können Sie die unerwünschten Zeilen "Warnung:" nach run_wrapper.shAbschluss einfach aus der Protokolldatei löschen .

Das folgende Shell-Skriptfragment speichert den Zeitstempel (in $ts) der Protokolldatei (in $lf) vor dem Ausführen sed -iund stellt ihn anschließend wieder her:

lf='output.log'

run_wrapper.sh >& "$lf"

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
sed -i -e '/Warning: Using a password/d' "$lf"
touch -t "$ts" "$lf"

Wenn Sie den Inode der Protokolldatei beibehalten müssen (z. B. weil sie feste Links enthält), verwenden Sie edstatt sed:

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
printf "%s\n" 'g/Warning: Using a password/d' w | ed -s "$lf"
touch -t "$ts" "$lf"
cas
quelle
Danke für die Antwort. Ich habe die vorgeschlagene Option wie unten versucht
jagadish puvvada
sed Option erstellt leere Zeilen und wir müssen sie auch entfernen und es ändert auch den Zeitstempel der Datei
jagadish puvvada
Die Option "Nachbearbeitung mit Sedierung" ändert auch den Inode sowie den Zeitstempel - das ist normal für -i(und die meisten Formen der "In-Place" -Bearbeitung "). Wenn sie unmittelbar danach ausgeführt wird, sollte sie nur Mikrosekunden oder Sekunden anders sein. je nach Logfile Größe natürlich Aber es gibt keine Möglichkeit , ein. din Befehl (Zeile löschen) sedwird erstellen eine leere Zeile - , was Sie damit genau meinen?
cas
Die sedOption @jagadishpuvvada speichert jetzt den Zeitstempel von output.log und stellt ihn wieder her.
Cas
0

Versuchen Sie, dies am Ende Ihres Befehls hinzuzufügen:

/ dev / null 2> & 1

user236164
quelle