我目前有一个 Perl 脚本,它在系统上运行外部命令,收集输出,并根据返回的内容执行一些操作。现在,这是我运行它的方式(其中 $cmd 是带有命令设置的字符串):
@output = `$cmd`;
我想更改此设置,以便如果命令挂起并且在很长时间后没有返回值,那么我会终止该命令。我将如何异步运行它?
有很多方法可以做到这一点:
- 您可以使用 fork 来完成此操作(perldoc -f fork)
- 或使用线程(perldoc 线程)。这两者都使得将返回的信息传递回主程序变得困难。
- 在支持它的系统上,您可以设置警报(perldoc -f Alarm),然后在信号处理程序中进行清理。
- 您可以使用 POE 或 Coro 等事件循环。
- 您可以使用 open() 或分别使用 open2 或 open3 (参见 IPC::Open2、IPC::Open3)来启动程序,同时通过文件句柄获取其 STDOUT/STDERR,而不是使用反引号。对其运行非阻塞读取操作。 (perldoc -f select 并可能谷歌“perl 非阻塞读取”)
- 作为 openX() 的更强大的变体,请查看 IPC::Run/IPC::Cmd。
- 大概有很多我半夜都想不起来的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)