У меня была ошибка в сценарии резервного копирования, запущенном как задание cron, которое я нашел и исправил, но меня все еще озадачивает тот факт, что эта ошибка не проявлялась при запуске сценария из командной строки. Сам скрипт запускается как root, а в какой-то момент запускает другой скрипт от имени другого пользователя (фактически как mysql).
su another_user -c "/some/path/another_script"
другой_скрипт, в свою очередь, в какой-то момент делает дамп базы данных:
mysqldump db_name > file.sql
Этот экземпляр mysql не имеет пароля root для localhost, поэтому выполнение этой команды от имени root всегда работает. Я не понимаю, что он все еще работает, если я запускаю этот сценарий из командной строки, хотя эта команда вызывается не пользователем root, а пользователем mysql. Журналы db показывают, что подключающийся пользователь по-прежнему «root». В то время как, когда скрипт запускается как задание cron, он терпит неудачу, как и ожидалось, журналы mysql показывают, что подключившимся пользователем был mysql.
Проблема на самом деле может быть воспроизведена так просто:
su mysql -c "mysqldump db_name > file.sql"
неожиданно подключается как пользователь root db, если запускается из командной строки как root и ожидаемо подключается как пользователь mysql db, если запускается как root cron.
Нет матери, которая вызовет команду, если пользователь находится на локальной машине.
Если вы разрешите root-доступ к% @ localhost, вы можете подключиться к серверу mysql с любым пользователем, который у вас есть.
Пример: если вы вошли в систему с пользователем test1, вы все равно можете подключиться к локальному mysql с пользователем root.
user1@machine~$ mysql -h localhost -u root
или
user1@machine~$ mysqldump -h localhost -u root mydatabase > backup.sql
Проверьте свой сценарий резервного копирования, который вы используете. Есть важные вещи.
Если вам нужно запустить сценарий с другим пользователем, вы можете использовать этот пример:
su - user1 -c "/path/scripts/backup.sh"
Причина, по которой вы наблюдаете два разных поведения, заключается в том, что cron не запускается в оболочке, поэтому все переменные среды, к которым у вас есть доступ в оболочке, отсутствуют в cron. Если вы хотите, чтобы cron вел себя так же, как в вашей оболочке, вам нужно вызвать его в оболочке env. Для bash это будет:
/bin/bash -l -c 'your command'