我的控制器代码如下:
system("PGUSER=#{ENV["DATABASE_USER"]} PGPASSWORD=#{ENV["DATABASE_PASSWORD"]} pg_dump db_name_#{ENV["RAILS_ENV"]} > /location/db_name_#{@backup.name}.dump")
当我在生产中的rails控制台中运行它时,它的ok和dump是正确的,但当它从创建大小为0 bytes
的控制器dump调用时。
这取决于流程的所有者。也许处理控制器请求的进程没有访问目标文件夹的权限,也没有执行pg_dump的权限。还需要审查和比较两种情况下的ENV var值。你确定rails env是一样的吗?
如果您有对服务器的ssh访问权限,您可以找到进程及其所有者。。。使用bash命令ps aux | grep -i passenger
或ps aux | grep -i unicorn
或ps aux | grep -i puma
或cat ./tmp/pids/server.pid
(然后您可以通过pid找到流程(
这取决于您的应用程序使用哪个web服务器模块。。。
然后,您需要授予进程所有者对目标文件夹的写访问权限。使用chown
、chmod
。
此外,您可以尝试对您的命令使用破解-在system
调用中使用带有密码的sudo
命令但我强烈不建议在生产中这样做
示例:system("echo 'password' | sudo -S -k #{dump_command}")
我在这里找到了Rails为dump&恢复PostgreSQL数据库
我在控制器中使用了它,并做了一些小改动:
system "RAILS_ENV=production rake db:dump"