файл задания cron:
46 13 * * * root /home/tmp/test_mysql.sh
сценарий:
execute_query(){ query="$1" res=`mysql --skip-column-names -e "$query"` echo "$res" } res=`execute_query "show databases"` echo $res
ошибка, которую я получил, когда задание cron успешно выполняет скрипт:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Я могу успешно выполнить сценарий из командной строки как root, потому что учетные данные для входа в mysql сохранены в /root/.my.cnf, что не так? cronjob почему-то не читает /root/.my.cnf?
Вы не должны полагаться на то, что клиент MySQL подберет соответствующий файл конфигурации MySQL из-за каскадная природа того, как клиент читает эти файлы. Вместо этого вы должны поставить оба my.cnf
и test_mysql.sh
внутри /home/tmp
и использовать --defaults-extra-file
[ссылка на сайт] в вашем скрипте.
Обратите внимание, --defaults-extra-file
должен быть первый аргумент вашей команды mysql, иначе он не сработает.
execute_query(){
query="$1"
res=`mysql --defaults-extra-file=/home/tmp/my.cnf --skip-column-names -e "$query"`
echo "$res"
}
res=`execute_query "show databases"`
echo $res
/root
это не очень хорошее место для размещения вещей (разрешений и т. д.), и его следует избегать.
Запуск сценариев, которые взаимодействуют с сервером MySQL, также следует выполнять с непривилегированным пользователем.