Erlangからシェルスクリプトを呼び出すときは、通常、終了ステータス(0など)が必要なので、次の関数を使用して実行します。
%% in module util
os_cmd_exitstatus(Action, Cmd) ->
?debug("~ts starting... Shell command: ~ts", [Action, Cmd]),
try erlang:open_port({spawn, Cmd}, [exit_status, stderr_to_stdout]) of
Port ->
os_cmd_exitstatus_loop(Action, Port)
catch
_:Reason ->
case Reason of
badarg ->
Message = "Bad input arguments";
system_limit ->
Message = "All available ports in the Erlang emulator are in use";
_ ->
Message = file:format_error(Reason)
end,
?error("~ts: shell command error: ~ts", [Action, Message]),
error
end.
os_cmd_exitstatus_loop(Action, Port) ->
receive
{Port, {data, Data}} ->
?debug("~ts... Shell output: ~ts", [Action, Data]),
os_cmd_exitstatus_loop(Action, Port);
{Port, {exit_status, 0}} ->
?info("~ts finished successfully", [Action]),
ok;
{Port, {exit_status, Status}} ->
?error("~ts failed with exit status ~p", [Action, Status]),
error;
{'EXIT', Port, Reason} ->
?error("~ts failed with port exit: reason ~ts",
[Action, file:format_error(Reason)]),
error
end.
これを使用して、プログラムをフォークして終了するスクリプトを開始するまで、これは正常に機能しました。
#!/bin/sh
FILENAME=$1
eog $FILENAME &
exit 0
(実際のユースケースでは、かなりの数の引数があり、プログラムに渡される前にいくつかのマッサージがあります)。ターミナルから実行すると、イメージが表示され、期待どおりにすぐに終了します。
しかし、Erlangから実行しているので、そうではありません。ログファイルで、正常に起動していることがわかります。
22/Mar/2011 13:38:30.518 Debug: Starting player starting... Shell command: /home/aromanov/workspace/gmcontroller/scripts.dummy/image/show-image.sh /home/aromanov/workspace/media/images/9e89471e-eb0b-43f8-8c12-97bbe598e7f7.png
eog
ウィンドウが表示されます。しかし、私は得られません
22/Mar/2011 13:47:14.709 Info: Starting player finished successfully
eog
プロセスを強制終了するまで(kill
ウィンドウを閉じるか、ウィンドウを閉じるだけ)、これは私の要件には適していません。なぜ行動の違い?それを修正する方法はありますか?