在Ruby中调用“system()”会等到它完成吗?

时间:2010-11-08 17:58:06

标签: ruby-on-rails ruby

我是铁杆上的红宝石新手。我想调用系统命令来分析我的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()调用完成执行。提前谢谢!

3 个答案:

答案 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不允许这种非内置系统调用。我将不得不改变我的托管服务。