При вызове сценариев оболочки из 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
или просто закрыв окно), что не подходит для моих требований.Почему разница в поведении?Есть ли способ это исправить?