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

Erlang how to start an external script in linux

我想 运行 一个外部脚本并从我的 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)

我查了一下脚本是运行ning:

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

您可以open a port using spawn or spawn_executable, and then use erlang:port_info/2获取其OS进程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 终止进程。