Будет ли вызов system () в Ruby ждать, пока он не завершится? - PullRequest
1 голос
/ 08 ноября 2010

Я новичок в рубине на рельсах. Я хочу вызвать системную команду для анализа загруженного файла в моем приложении 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

Он отлично работает на моей локальной машине, но по какой-то причине функция "parse_csv" не будет вызвана на сервере (dreamhost). Однако я вручную вызываю системную команду c_executable на сервере, и она без проблем выводит файл csv. Может кто-нибудь сказать мне, что может быть причиной проблемы здесь? Я думал, что системный вызов занимает некоторое время, чтобы закончить на сервере. Если это так, я задаюсь вопросом, есть ли способ сообщить rails ждать, пока системный вызов не завершит выполнение. Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Системный вызов должен блокироваться, пока команда внутри не будет завершена. Возможно, файл создается не так, как вы предполагали, что может помешать запуску этой части вашего приложения.

Возможно, вы захотите использовать другой способ построения вашего пути, чтобы быть уверенным, что вы все правильно поняли:

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 голос
/ 08 ноября 2010

Мое первое предположение - ошибка прав доступа. Знаете ли вы, под каким пользователем работает веб-сервер / сервер приложений, и посмотрите, есть ли у него правильные права на чтение и выполнение команды, а также на запись выходного файла.

0 голосов
/ 15 ноября 2010

Я сейчас отвечу на свой вопрос.Потратив несколько дней на тестирование и поиск в Google, выясняется, что Dreamhost не разрешает подобные не встроенные системные вызовы.Мне придется сменить хостинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...