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
终止进程。
我想 运行 一个外部脚本并从我的 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
终止进程。