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

Kam*_*han 2 erlang

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

我试过这个

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

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

更新

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

while(1){
    sleep 1;
}
Run Code Online (Sandbox Code Playgroud)

然后尝试使用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)
Run Code Online (Sandbox Code Playgroud)

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

$ ps -ef | grep loop.pl
root    10357 10130  0 17:35 ?        00:00:00 perl loop.pl
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 7

您可以使用或打开端口,然后使用它来获取其操作系统进程ID:spawnspawn_executableerlang:port_info/2

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)).
[]
Run Code Online (Sandbox Code Playgroud)

设置PortOptions为适合您的使用情况.

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