我正在尝试从我的rails控制器运行ruby脚本。 当rails服务器正常启动时,脚本成功运行
rails s thin -e development
但是当rails服务器作为守护进程启动时,ruby脚本无法运行。
rails s thin -e development -d
在控制器内部,使用 exec 命令运行ruby脚本。
script_exec = exec("ruby /Code/AttendanceReport/attn/bin/scripts/Spreadsheet_proper.rb '#{city}' '#{date1}' '#{date2}'")
上述方法会杀死rails服务器并且不会执行ruby脚本。因此我用了
script_exec = %x{ruby /Code/AttendanceReport/attn/bin/scripts/Spreadsheet_proper.rb '#{city}' '#{date1}' '#{date2}' }
script_exec = system("ruby /Code/AttendanceReport/attn/bin/scripts/Spreadsheet_proper.rb '#{city}' '#{date1}' '#{date2}'")
当使用-d启动run rails服务器时,上述%x 和系统方法也会失败。但是当rails服务器正常时它确实有效。
因此,我尝试了使用守护进程的不同方法 在我的控制器中
file_path1 = "/Code/AttendanceReport/attn/bin/scripts/Spreadsheet_proper_control.rb"
script_exec = %x{ruby #{file_path1} start -- #{city} #{date1} #{date2}}
Spreadsheet_proper_control.rb具有
require 'daemons'
Daemons.run('/Code/AttendanceReport/attn/bin/scripts/Spreadsheet_proper.rb')
这种方法也失败了。在记录时,返回上述方法的假值。
但是当从终端手动运行时,上面的守护进程正在完美运行。
ruby Spreadsheet_proper_control.rb start -- 'Melbourne' '2015-06-01' '2015-10-01'
当我登录终端会话并且正常启动rails服务器时,ruby脚本会运行 - 终端会话是否应该结束服务器。
简洁的应用环境: -
Spreadsheet_proper.rb会生成一个xls文件,然后将其压缩并作为控制器的响应发送。
创建并写入Excel工作表的ruby代码中的行。
excel_file = Spreadsheet::Workbook.new
sheet1 = excel_file.create_worksheet :name => 'Melbourne Attendance'
#some code here
excel_file.write("/Code/AttendanceReport/attn/files/excel/Attendance-#{Time.now}.xls")
由于ruby脚本的输出由控制器作为响应发送,我不能用于延迟工作。
有没有其他方法在Rails控制器内部成功运行Ruby脚本,而Rails服务器在作为守护进程启动时会被杀死?
更新: -
在使用rails logger进行调试时,我发现当使用-d标志启动rails服务器并且使用%和 system >运行脚本时,控制器正在运行ruby脚本STRONG>。但该文件不是由ruby脚本创建的(即仅使用以-d开头的rails服务器)
登录开发环境后的错误消息是
Errno::ENOENT (No such file or directory @ rb_file_s_lstat - /Code/AttendanceReport/attn/files/excel/Attendance-Melbourne-16:47:24.xls):