Подавить предупреждающие сообщения от MySQL в сценарии оболочки, но разрешить ошибки

10

Мои файлы журнала сбрасываются со следующим сообщением при выполнении сценариев оболочки с использованием некоторых базовых команд MySQL.

Вот сообщение:

«Предупреждение. Использование пароля в интерфейсе командной строки может быть небезопасным».

Чтобы остановить эти сообщения, я использую следующее определение задания.

Пример:

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

Это сработало, но ошибки MySQL не регистрируются output.log.

Если я изменю определение следующим образом, то ошибки MySQL начнут появляться, если таковые имеются

run_wrapper.sh > output.log 2>&1

Таким образом, вопрос заключается в том, как подавить предупреждающие сообщения, а также сообщить об ошибках SQL в файлах журналов, используя только определение cron?

Jagadish Puvvada
источник
вероятно, вы должны использоватьrun_wrapper.sh >> output.log 2>&1
Rahul
1
Я не следую. Куда бы вы хотели, чтобы отправлялись сообщения об ошибках / предупреждениях, и куда вы хотите, чтобы вывод выводился, и что бы вы хотели выбросить? Что генерирует предупреждение о пароле и почему у вас есть ошибки в MySQL, которые вы не хотите исправлять?
Кусалананда
1
mysql печатает это предупреждение, когда вы используете -pопцию в командной строке. Вместо того, чтобы исправить его (например, путем создания ~/.my.cnfс 600 перми) ОП хочет просто игнорировать и отбрасывать предупреждение (и только это предупреждение, а не все stderr)
cas

Ответы:

25

В вашем скрипте bash отредактируйте его сверху

export MYSQL_PWD=yourdbpassword

и MySQL запрос, как: mysql -u username -h host db -e "statement"

Ссылка: Из ответа, опубликованного на Stackoverflow . Другие ответы также могут следовать.

маргаритка
источник
2

найдите строку в вашей обёртке, похожую на

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

и изменить на

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

это решает источник предупреждения.

Моклер
источник
Это имеет смысл :-) Спасибо!
Майк Q
1

Похоже, вы пропускаете перенаправление stderr от run_wrapper.shсамого себя, поэтому ошибки не проходят через grepи в файл журнала.

Попробуйте вместо этого, если вы счастливы, что и stdout, и sdterr записаны в ваш лог-файл

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

Или, если вы хотите, чтобы только ошибки записывались в файл журнала, а stdout оставлял запись в вызывающий терминал, попробуйте это

( run_wrapper.sh 2>&1 1>&3 | grep -v "Warning: Using a password" > output.log ) 3>&1
roaima
источник
0

Попробуй это:

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

Перенаправление стандартного вывод с помощью процесса замещения к grep -v ..., и с выходом , который добавляется >>кoutput.log

Вы, вероятно, хотите использовать опцию (GNU) grep, --line-bufferedа также -vубедиться, что вывод ошибок не задерживается.


Если постобработка файла журнала является приемлемым вариантом для вас, вы можете просто удалить ненужные строки «Предупреждение:» из файла журнала после run_wrapper.shзавершения.

Следующий фрагмент сценария оболочки сохраняет временную метку (in $ts) файла журнала (in $lf) перед запуском sed -iи восстанавливает ее впоследствии:

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"

Если вам нужно сохранить inode файла журнала (например, потому что он содержит жесткие ссылки), используйте edвместо 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"
саз
источник
Спасибо за ответ. Я попробовал предложенный вариант, как показано ниже
Jagadish Puvvada
Опция sed создает пустые строки, и мы также должны удалить их, а также
изменить временную
Опция post-process-with-sed также изменяет индекс и временную метку - это нормально для -i(и большинства форм «редактирования на месте»). Если запуск выполняется сразу после этого, он должен отличаться только микросекундами или секундами, конечно, в зависимости от размера файла журнала. Но ни в коем случае dкоманда (удалить строку) sedне создаст пустую строку - что именно вы подразумеваете под этим?
cas
Опция @jagadishpuvvada sedтеперь сохраняет и восстанавливает временную метку output.log.
Cas
0

Попробуйте добавить это в конец вашей команды:

/ dev / null 2> & 1

user236164
источник