Erlang如何在linux中启动外部脚本

时间:2015-10-23 22:16:39

标签: erlang

我想运行一个外部脚本,并从我的erlang程序中获取进程的PID(一旦启动)。稍后,我将要从erlang代码向该PID发送TERM信号。我该怎么做?

我试过这个

P = os:cmd("myscript &"),
io:format("Pid = ~s ~n",[P]).

它按预期在后台启动脚本,但我没有得到PID。

更新

我制作了以下脚本(loop.pl)进行测试:

while(1){
    sleep 1;
}

然后尝试使用open_port生成脚本。该脚本运行正常。但是,erlang:port_info / 2槽异常:

2> Port = open_port({spawn, "perl loop.pl"}, []).
#Port<0.504>
3> {os_pid, OsPid} = erlang:port_info(Port, os_pid).
** exception error: bad argument
     in function  erlang:port_info/2
        called as erlang:port_info(#Port<0.504>,os_pid)

我检查了脚本是否正在运行:

$ ps -ef | grep loop.pl
root    10357 10130  0 17:35 ?        00:00:00 perl loop.pl

1 个答案:

答案 0 :(得分:7)

您可以open a port使用spawnspawn_executable,然后使用erlang:port_info/2获取其操作系统进程ID:

1> Port = open_port({spawn, "myscript"}, PortOptions).
#Port<0.530>
2> {os_pid, OsPid} = erlang:port_info(Port, os_pid).
{os_pid,91270}
3> os:cmd("kill " ++ integer_to_list(OsPid)).
[]

根据您的使用情况设置PortOptions

如上面的最后一行所示,如果您愿意,可以使用os:cmd/1来终止该过程。