sh

2016-03-19 30 views
4

kullanarak bir çıkışı izlerken bu hatayı çözemiyorum Bir optimizasyon üzerinde çalışıyorum ve bunun için bir linux programına bir matlab kodunu bağlamanız ve çıktıları izlemem gerekiyor. Bu bağlantıyı aşağıdaki gibi kullanarak yaptım, ancak iyi çalışmadı, çünkü birden fazla 'ifadeyi' takip edemedim.sh

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

Yardım isteğinde bulundum ve iyi bir çözüm buldum. Çözüm kısmen problemi çözdü. Programın istendiği anda çalıştırılması, bu ifadeleri takip etmek ve gerektiğinde programı öldürmek mümkün oldu. Verilen çözüm oldu:

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

ben matlab üzerinde uygulanan ve kod iyi yanıt vermedi 'askıyı yaptığında. Birkaç dakika sonra matlab sıkıştı, terminalden herhangi bir cevap alamadım. Programımın çıktılarını manuel olarak incelediğimde, programda herhangi bir sorun olmadığını ve çıktıların normal olarak yazıldığını fark ettim.

Bu sorunu çözemiyorum. Benim için çok fazla tecrübem yok. Cevap aradım ama bulamadım. Aynı şeyi elde etmek için alternatif öneriler de kabul edilir. peşin

cevap

1

kuyruk -f asmak neden oluyor içinde

teşekkürler. Devam etmek için sed/kuyruk işlemini de öldürmeniz gerekir.

#!/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

İlgili konular