問題が何であるかについての情報をまだ追加していません。しかし、他にもコメントしたいことがいくつかあります。
現在の作業ディレクトリ
使用してfile:set_cwd(Path)
いるため、開始されたコマンドはそのパスを継承します。ファイル サーバーの cwd はグローバルです。おそらく、アプリケーション コードではまったく使用しないでください。erlang のクラッシュ ダンプを書きたい場所などに cwd を設定するのに便利です。
レールを cwd で実行させたいというあなたの願いは、次のPath
ようなものでうまく機能します:
_ ->
Response = os:cmd(string:join(["cd", Path, "&&", "Rails", Name, Args], " ")),
{reply, Response, State}
つまり、シェルを起動してコマンド ラインを解析し、シェルで cwd を変更して Rails を起動します。
gen_server のブロック
gen_server は、処理をシリアル化するために存在します。つまり、メッセージを次々と処理します。それらすべてを同時に処理するわけではありません。それらを同時に処理しないことが存在理由です。
(他のコストに関連して) gen_server で非常にコストのかかる計算を行っています: この Rails アプリケーションを実行する外部プロセスを開始します。一度に最大 1 つの Rails アプリケーションを実行するつもりですか? (プロセスごとに大量のメモリを必要とする ruby on rails について聞いたことがあるので、賢明な決定かもしれません)。
コード例のように、コストのかかる呼び出しからの値で State を更新する必要がない場合は、明示的な gen_server:reply/2 呼び出しを使用できます。
_ ->
spawn_link(fun () -> rails_cmd(From, Path, Name, Args) end),
{no_reply, State}
そして、あなたは持っています
rails_cmd(From, Path, Name, Args) ->
Response = os:cmd(string:join(["cd", Path, "&&", "Rails", Name, Args], " ")),
gen_server:reply(From, Response).