2016-03-19 11 views
4

私は最適化に取り組んでいます。そのためには、matlabコードをLinuxプログラムにリンクし、出力を監視しておく必要があります。私は以下のこのshを使ってこのリンクを行っていましたが、複数の '式'を追跡することができなかったので、うまくいきませんでした。shを使って出力を監視しているときにこのエラーを解決できません

#!/bin/bash 
../program inputfile &> OutputFile.dat & 
tail -f OutputFile.dat | sed -n '/NaN/q;/STOP/q' 
killall program 

私はここで助けを求めました。私は良い解決策を得ました。解決策は部分的に問題を解決しました。プロンプトでプログラムを実行すると、それらの式を追跡し、必要なときにプログラムを終了することができました。与えられたソリューションでした:

#!/bin/bash 
(stdbuf -o 0 -e 0 ../program inputfile &) &> OutputFile.dat 
sed -n '/NaN/q;/STOP/q' <(tail -f OutputFile.dat) 
killall program 

私はMathWorks社のMATLAB上で実装し、コードがうまく反応しなかった「結合」をやったとき。数分走った後、matlabが動かなくなり、端末から何の答えも得られなかった。私のプログラムの出力を手作業で調べると、プログラムに問題はなく、出力は通常書かれていたことに気付きました。

この問題は解決できません。私はshで多くの経験がありません。私は答えを探しましたが、何も見つかりませんでした。同じことを達成するための代替提案も歓迎されます。

ありがとうございます。

答えて

1

tail -fがハングを引き起こしています。続行するには、sed/tailプロセスも終了する必要があります。

#!/bin/bash 

(stdbuf -o 0 -e 0 ../program inputfile &) &> OutputFile.dat 
# get the process id (pid) of "program" 
# (bash sets $! to the pid of the last background process) 
program_pid=$! 

# put this in the background, too 
sed -n '/NaN/q;/STOP/q' <(tail -f OutputFile.dat) & 
# get its pid 
sed_pid=$! 

# wait while "program" and sed are both still running 
while ps -p $program_pid && ps -p $sed_pid; do 
    sleep 1 
done >/dev/null 

# one (or both) have now ended 
if ps -p $program_pid >/dev/null; then 
    # "program" is still running, and sed must have found a match and ended 
    echo "found Nan or STOP; killing program" 
    kill $program_pid 
elif ps -p $sed_pid; then 
    # sed is still running, so program must have finished ok 
    kill $sed_pid 
fi 

REF:https://stackoverflow.com/a/2041505/1563960

関連する問題