2013-04-10 1 views
1

У меня есть набор проектов на C++ в Code :: Blocks и скрипт, который строит все из них. Сценарий выглядит следующим образом:Linux shell kill command пока работает на основе вывода

codeblocks --build --target="release32" project1.cbp 
codeblocks --build --target="release32" project2.cbp 
codeblocks --build --target="release32" project3.cbp 
... 

Иногда при создании одного из проектов, Code :: Blocks не удается завершить процесс с ошибкой: *** glibc detected *** codeblocks: corrupted double-linked list. Это не имеет ничего общего со сборкой быть неудачной, это просто ошибка в CodeBlocks, смотрите здесь: https://bugs.launchpad.net/ubuntu/+source/codeblocks/+bug/764728 или здесь: http://forums.codeblocks.org/index.php?topic=16883.0

Обходной, что я хочу сделать, это разобрать вывод команды время он все еще работает, найдите строку «codeblocks: поврежденный двойной список» и убейте кодовые блоки, чтобы сценарий мог строить другие проекты и заканчивать.

Как я могу это сделать?

+0

Один не смог команду 'CodeBlocks --build --target =«release32»project1.cbp' не будет вызывать дополнительные команды, которые будут пропущены, если вы не' установить -e', или работает с 'Makefile' .. – anishsane

+1

Это не подводит, оно просто печатает ошибку и не выходит. Другие команды не выполняются, потому что эта команда еще не закончена. – psyched

ответ

2

Немного хакеры, но это будет работать для вас (bash)?

Это только для имитации CodeBlocks двоичных (./codeblocks):

$ cat codeblocks 
#!/bin/bash 

num=$RANDOM 
((num %= 2)) 

case "$num" in 
     0) 
       echo "codeblocks finished successfully: $*" 
       exit 0 
       ;; 
     1) 
       echo "*** glibc detected *** codeblocks: corrupted double-linked list" 1>&2 
       while true; do 
         sleep 1 
       done 
       ;; 
esac 

Это реальный тестовый скрипт (test.sh):

$ cat test.sh 
#!/bin/bash 

run_codeblocks() 
{ 
     until (
       subshell_pid=$BASHPID 
       echo "trying to run 'codeblocks $*'" 
       ./codeblocks "[email protected]" 2>&1 | while read line; do 
         echo "[${line}]" 
         [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid 
       done 
       return 0 
     ); do 
       : 
     done 
} 

echo "running codeblocks ..." 
run_codeblocks 1 
run_codeblocks 2 
run_codeblocks 3 
echo "... done" 

Вы обернуть вызов codeblocks в субоболочке, grep его выход, и если строка соответствует указанной вами ошибке, убивает подоболочку. В основном именно то, что вы описали.

$ ./test.sh 
running codeblocks ... 
trying to run 'codeblocks 1' 
[codeblocks finished successfully: 1] 
trying to run 'codeblocks 2' 
[*** glibc detected *** codeblocks: corrupted double-linked list] 
./test.sh: line 4: 29889 Terminated    (subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "[email protected]" 2>&1 | while read line; do 
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0; 
done) 
trying to run 'codeblocks 2' 
[*** glibc detected *** codeblocks: corrupted double-linked list] 
./test.sh: line 4: 29892 Terminated    (subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "[email protected]" 2>&1 | while read line; do 
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0; 
done) 
trying to run 'codeblocks 2' 
[codeblocks finished successfully: 2] 
trying to run 'codeblocks 3' 
[*** glibc detected *** codeblocks: corrupted double-linked list] 
./test.sh: line 4: 29903 Terminated    (subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "[email protected]" 2>&1 | while read line; do 
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0; 
done) 
trying to run 'codeblocks 3' 
[codeblocks finished successfully: 3] 
... done 
+0

Это выглядит потрясающе, и это почти сработало! Почти ... Я не знаю, почему, но часть обработки обрабатывается «во время чтения строки», а другая - нет. Вы сделали хорошую вещь, завернув вывод в квадратные скобки. Вот как выглядит мой вывод: http://pastebin.com/nu0PRCqg – psyched

+0

@ user1113852 Дикая догадка, некоторый вывод идет на stderr, который не попал туда. Попробуйте перенаправить stderr блока кода в stdout ('2> & 1') перед трубой чтения. –

+0

Пытался перенаправить, как вы сказали, все еще не пойман. Также я понял, что ошибка происходит сразу после вызова, а не в конце, как я думал. Таким образом, недостаточно просто убить кодовые блоки, мне также нужно повторить неудачную команду. О, парень. – psyched