使用 sh 监视输出时无法解决此错误
Can't solve this error when monitoring a output using sh
我正在进行优化,为此我需要将 matlab 代码 link 转换为 linux 程序并持续监控输出。我已经使用下面的这个 sh 完成了这个 link,但是效果不佳,因为我无法跟踪多个 'expression'.
#!/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
当我在 matlab 上实现并执行 'linkage' 时,代码响应不佳。几分钟后 运行,matlab 卡住了,我无法从终端得到任何答复。当手动查看我的程序的输出时,我意识到程序没有问题,并且输出正常被写入。
我无法解决这个问题。我对 sh 没有太多经验。我已经搜索了答案,但找不到任何答案。也欢迎实现相同目标的替代建议。
提前致谢
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
参考:
我正在进行优化,为此我需要将 matlab 代码 link 转换为 linux 程序并持续监控输出。我已经使用下面的这个 sh 完成了这个 link,但是效果不佳,因为我无法跟踪多个 'expression'.
#!/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
当我在 matlab 上实现并执行 'linkage' 时,代码响应不佳。几分钟后 运行,matlab 卡住了,我无法从终端得到任何答复。当手动查看我的程序的输出时,我意识到程序没有问题,并且输出正常被写入。
我无法解决这个问题。我对 sh 没有太多经验。我已经搜索了答案,但找不到任何答案。也欢迎实现相同目标的替代建议。
提前致谢
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
参考: