У меня есть сценарий под названием /etc/cron.daily/99loganalyzer_expire, который выглядит так:
#!/bin/bash
SQL="DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURDATE(),INTERVAL 30 DAY)"
MYSQL_USER="loganalyzer"
MYSQL_PASS="loganalyzerpassword"
MYSQL_DB="Syslog"
echo $SQL | /usr/bin/mysql --user=$MYSQL_USER --password=$MYSQL_PASS $MYSQL_DB
Когда он запускается ночью, я получаю электронное письмо, в котором говорится, что он не удался:
/etc/cron.daily/99loganalyzer-expire:
ERROR 1045 (28000): Access denied for user 'loganalyzer'@'localhost' (using password: YES)
... однако, когда я запускаю его как root с консоли, он работает:
# time /etc/cron.daily/99loganalyzer-expire
real 1m16.391s
user 0m0.012s
sys 0m0.008s
Как я могу передать учетные данные для этого пользователя mysql, чтобы они работали в cronjob?
Ввод учетных данных для входа в такую командную строку рискованно, так как любой, кто может просматривать список процессов, может просмотреть эти учетные данные. Лучше всего поместить эти учетные данные в файл параметров, например ~ / .my.cnf, а затем указать этот файл в своей команде.
[client]
user="loganalyzer"
password="loganalyzerpassword"
Не забудьте изменить права доступа на 0600 для этого файла параметров, чтобы предотвратить его просмотр кем-либо, кроме владельца. Тогда ваша команда mysql будет:
echo $SQL | /usr/bin/mysql --defaults-file=/root/.my.cnf Syslog
Более подробную информацию о файлах опций можно найти на http://dev.mysql.com/doc/refman/5.6/en/option-files.html.
Вам нужно использовать другую команду.
Примерно так должно работать:
#!/bin/bash
mysql -uUSERNAME -pPASSWORD -e "DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURDATE(),INTERVAL 30 DAY);" syslog
Возможно, потребуется адаптация к вашим потребностям, и я не уверен на 100%, как выбирается БД.
Неправильный порядок, последняя строка, что перед трубкой, должна быть в конце строки.
Я имею в виду, что команда SQL - это последний бит.