【问题标题】:Cancelling a unix process started by matlab取消由 matlab 启动的 unix 进程
【发布时间】:2013-08-02 11:40:20
【问题描述】:

您好,在这种情况下,我正在尝试从 matlab 运行一个进程 xfoil。问题有时是 xfoil 崩溃,因此要继续进行而没有问题,我需要将其作为后台进程运行。但是现在我最终遇到了一个竞争条件,其中 xfoil 在需要数据时还没有完成。为了解决这个问题,我添加了一个暂停语句,但在许多情况下,暂停太长了。我想做的是在启动时记录进程ID,然后在while循环中检查进程是否仍然存在。 对于 Windows,这是这样完成的。

elseif(ispc)
    run_xfoil_command='start /b xfoil.exe < foilcommands > dump.out';
    [~,~] = system(run_xfoil_command);
    tic;
    % While xfoil hasn't finished running
    while (system('tasklist /FI "IMAGENAME eq xfoil.exe" 2>NUL | find /I /N "xfoil.exe">NUL')==0)
        if (toc>5)
            [~,~] = system('taskkill /F /IM xfoil.exe > dump1.out');
            break
        end
        pause(0.2);
    end
    [~,~] = system('taskkill /F /IM cmd.exe > dump1.out');
end

但是我不知道如何在 linux 中实现这一点。 我试过了;

if(isunix)
    run_xfoil_command='pidof xfoil < foilcommands > dump.out &';
    setenv('GFORTRAN_STDIN_UNIT', '5')
    setenv('GFORTRAN_STDOUT_UNIT', '6')
    setenv('GFORTRAN_STDERR_UNIT', '0')
    tic;
    [stat,pid] = unix(run_xfoil_command)

但是,进程 ID 不会在 pid 或 dump.out 中返回。任何人都可以帮助解决这个问题。 谢谢。

【问题讨论】:

  • 统计数据呢?有什么吗?
  • 根据man,pidof返回一个运行程序的pid。你如何开始你的计划?
  • 顺便说一句 - 如果 xfoil 在您需要数据时还没有完成,那么期望的结果是什么?要么你等待,要么你真的不需要数据?
  • 使用稍有不同的输入再次运行。失败的主要原因是过度分离阻碍收敛,因此可以通过减小攻角、增加雷诺数来解决。

标签: bash matlab unix pid


【解决方案1】:

正如我在评论中所说,pidof 只能获得正在运行的程序的pid。如果命令xfoil 是让您的程序运行的原因,您应该尝试

xfoil < foilcommands &; /sbin/pidof xfoil > dump.out

然后检查dump.out的内容。我想你的pid 会在那里...

【讨论】:

    【解决方案2】:

    据我所知,您在这里只犯了一个错误。 这条线

    run_xfoil_command='pidof xfoil < foilcommands > dump.out &';
    

    必须

    run_xfoil_command='pidof xfoil > foilcommands > dump.out &';
    

    pidof 返回命令 xfoil 的进程 id,可以存储在 foilcommands 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多