我正在使用Windows MATLAB运行SSH命令,但SSH命令偶尔会无限期挂起,我的MATLAB脚本也会无限期挂起(有时在通宵运行时)。我如何才能在一定的等待时间后让命令超时?例如,假设我不想等待SSH命令超过3秒才能完成执行,然后中断它并继续:
% placeholder for a command that sometimes hangs
[status,result] = system('ssh some-user@0.1.2.3 sleep 10')
% placeholder for something I still want to run if the above command hangs
[status,result] = system('ssh some-user@0.1.2.3 ls')
我想创建一个函数sys_with_timeout
,它可以像这样使用:
timeoutDuration = 3;
[status,result] = sys_with_timeout('ssh some-user@0.1.2.3 sleep 10', timeoutDuration)
[status,result] = sys_with_timeout('ssh some-user@0.1.2.3 ls', timeoutDuration)
我已经尝试了timeout function from FEX,但它似乎不适用于system/SSH命令。
2条答案
按热度按时间yk9xbfzb1#
我不认为
system
命令是非常灵活的,我也不认为有什么方法可以用它来做你想做的事情,但是我们可以使用内置在MATLAB中的Java功能来做这件事,根据this answer by André Caron。下面是等待进程超时完成的方法:
在本例中,我们运行
sleep 20
shell命令,然后waitFor()
等待程序完成,但最长等待10秒。我们轮询进程是否仍在运行,如果仍在运行,则终止它。exitValue()
返回状态(如果需要)。运行
sleep 5
时,我看到:运行
sleep 20
时,我看到:wsxa1bj12#
基于@Cris Luengo的答案,这里是
sys_with_timeout()
函数。我没有使用process.waitFor()
函数,因为我更愿意在while循环中等待,并在命令输入时显示输出。while循环在命令完成或超时时中断,以先发生者为准。为了简单起见,将
ssh some-user@0.1.2.3
替换为wsl
(当然需要WSL),下面是一个超时函数的示例:这是一个不会超时的函数的例子