取消由matlab启动的unix进程

时间:2013-08-01 13:49:22

标签: bash matlab unix pid

您好我正试图在这种情况下从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)

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

2 个答案:

答案 0 :(得分:1)

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

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

必须是

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

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

答案 1 :(得分:1)

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

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

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