我想运行一个外部脚本,并从我的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
答案 0 :(得分:7)
您可以open a port使用spawn
或spawn_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
来终止该过程。