我是铁杆上的红宝石新手。我想调用系统命令来分析我的Rails应用程序中的上传文件。如下:
after_save :analyse #post processing call
def analyse
command = "./c_executable " + Rails.root.to_s + "/output_csv_file"
system(command)
if FileTest.exists?(Rails.root.to_s + "/output_csv_file")
parse_csv
end
end
它在我的本地计算机上运行正常,但由于某种原因,不会在服务器(dreamhost)上调用函数“parse_csv”。但是,我在服务器上手动调用c_executable系统命令,它输出csv文件没有问题。谁能告诉我这可能导致问题的原因?我在想系统调用需要一些时间才能在服务器上完成。如果是这种情况,我想知道是否有办法告诉rails等到system()调用完成执行。提前谢谢!
答案 0 :(得分:4)
系统调用应该阻塞,直到内部命令完成。可能没有按照您的意图创建文件,这可能会阻止您的应用程序部分运行。
您可能希望使用不同的方法来构建路径,以确保正确使用它:
csv_path = File.expand_path('output_csv_file', Rails.root)
unless (system('./c_executable', csv_path))
# Could't execute system command for some reason.
end
if (File.exists?(csv_path))
# ...
end
进行system
调用时,通常最好指定可执行文件的完整路径,因为您的应用程序PATH
可能与您预期的不同。
答案 1 :(得分:1)
我的第一个猜测是它是权限错误。您知道Web / app服务器正在运行的用户,并查看它是否具有读取/执行命令和写入输出文件的正确权限。
答案 2 :(得分:0)
我现在回答我自己的问题。经过几天的测试和谷歌搜索,结果发现dreamhost不允许这种非内置系统调用。我将不得不改变我的托管服务。