我在作为 cron 作业运行的备份脚本中发现一个错误,并已将其纠正,但我仍然对从命令行启动脚本时没有显示此错误感到困惑。脚本本身以 root 身份启动,并在某个时刻以另一个用户身份(实际上是“mysql”)启动另一个脚本
su another_user -c "/some/path/another_script"
another_script 反过来在某个时候进行数据库转储:
mysqldump db_name > file.sql
此 mysql 实例没有 localhost 的 root 密码,因此以 root 身份运行此命令始终有效。我不明白的是,如果我从命令行启动此脚本,它仍然有效,尽管此命令不是由“root”调用,而是由“mysql”用户调用。数据库日志显示连接用户仍然是“root”。而当脚本作为 cron 作业启动时,它会按预期失败,mysql 日志显示连接用户是“mysql”。
该问题实际上可以简单地重现如下:
su mysql -c "mysqldump db_name > file.sql"
不料如果以 root 身份从命令行启动,则以 root db 用户身份连接,并且预料之中地如果作为 root cron 作业启动,则以 mysql db 用户身份连接。
答案1
如果用户在本地机器上,无论谁调用该命令。
如果您允许 root 访问 %@localhost,您可以使用任何用户连接到 mysql 服务器。
例如:如果您以用户 test1 身份登录,您仍然可以以用户 root 身份连接到本地 mysql。
user1@machine~$ mysql -h localhost -u root
或者
user1@machine~$ mysqldump -h localhost -u root mydatabase > backup.sql
检查你正在使用的备份脚本。这是很重要的事情。
如果您需要以不同的用户身份运行脚本,您可以使用此示例:
su - user1 -c "/path/scripts/backup.sh"
答案2
您遇到两种不同行为的原因是 cron 不在 shell 中运行,因此您在 shell 中可以访问的所有环境变量在 cron 中都缺失。如果您希望 cron 的行为与在 shell 中的行为相同,则需要在 shell 环境中调用它。对于 bash 来说,这将是:
/bin/bash -l -c 'your command'