2015-02-07 4 views
-1

у меня есть Баш скрипт, который показывает «Сегмент Нарушение» на линиивина Сегментация на Баш скрипт

sp-sc-auth "${sopUrl}" 8809 8908 > /dev/null & 

но когда sp-sc-auth выполнен из терминала работает отлично

Я установил:

set -o pipefail 
set -o errexit 
set -o xtrace 
set -o nounset 

конец сценария продолжается, но выдает ошибку «Ошибка сегментации» ...

Система представляет собой DEBiAN 64 бита

Заранее спасибо Regars

Уродливый код:

#!/usr/bin/env bash 
# Init 
set -o pipefail 
set -o errexit 
#set -o xtrace 
set -o nounset 

__DIR__="$(cd "$(dirname "${0}")"; echo $(pwd))" 
__BASE__="$(basename "${0}")" 
__FILE__="${__DIR__}/${__BASE__}" 

ARG1="${1:-Undefined}" 

display_usage() { 
    scriptName=$(basename $0) 
    echo -e "Uso:\n "${scriptName}" [6,7,8,9,10 o 12]" 
    echo "Sin especificar el canal, búsqueda de retransmisiones" 
} 

parse_arenavision() { 
url="http://www.arenavision.in/agenda" 

if ! av=$(curl -s "${url}");then 
    echo "Sin conexión" 
    exit 1 
fi 
started="off" 
declare -a _list 
element="" 

while read line 
do 
if [[ $line =~ (([0-9][0-9]+/[0-9]+/[0-9]+.*)) ]]; then 
    element=$(echo "${BASH_REMATCH[0]}" | sed -r 's#CET|AV([^6789]|1[02])##g; s#<br />##g; s#//|&.*;##g; s#/\s*$##g; s#INGLATERRA/PREMIER LEAGUE#PREMIER#g; s#ITALIA/SERIE A#SERIE A#g; s#ITALIA/SERIE A#SERIE A#g;' | tr -dc '[:print:]') 
    if [[ "${element}" =~ (.*AV[6789]|.*AV10|.*AV12) ]]; then 
    _list+=("${element}") 
    fi 
    started="on" 
else 
    if [[ ${started} == "on" ]]; then 
     break 
    fi 
fi 
done <<< "${av}" 

for i in "${_list[@]}"; do 
    if [[ "${i}" =~ (.*BALONCESTO.*) ]]; then 
     echo -e "\e[92m${i}\e[0m" 
    elif [[ "${i}" =~ (.*LIGA BBVA.*) ]]; then 
     echo -e "\e[37m${i}\e[0m" 
    else 
     echo "${i}" 
    fi 
done 

} 

case $ARG1 in 
    "Undefined") 
     parse_arenavision 
     exit 0 
     ;; 
    [6789]) 
     page="${ARG1}" 
     ;; 
    10) 
     page="${ARG1}" 
     ;; 
    *) 
     display_usage 
     exit 1 
     ;; 
esac 

# Delete "zombies" 
if pgrep -f "sp-sc" 
then 
    kill -9 `pgrep -f "sp-sc-auth"` 
fi 

url="http://www.arenavision.in/arenavision$page" 

# Get url content and url sop 
if ! content=$(curl -s "${url}");then 
    echo "Sin conexión" 
fi 

if [[ $content =~ (sop://([A-Za-z0-9_]+|\.)+:[0-9]+) ]]; then 
    sopUrl=${BASH_REMATCH[1]} 
else 
    echo "No se ha encontrado la url" 
    exit 1 
fi 

# Connect ArenaVision 1 
children="" 
trap 'kill $children 1>/dev/null 2>&1; exit 143' EXIT 

sp-sc-auth "${sopUrl}" 8809 8908 > /dev/null & 
children="$!" 

# Check if exists 
line='[    ]' 
for i in {0..15} 
do 
replace="${line/ /#}" 
line=$replace 
echo -ne "Comprobando sopcast ${replace}" \\r 
sleep 1 
done 
echo -ne "\033[2K" 

if ! kill -0 "${children}" 1>/dev/null 2>&1; then 
    echo "Sin emisión" 
    exit 1 
else 
    echo -ne "Comprobando sopcast [ OK ]" \\r 
    echo 
fi 

# Open VLC player 
line='[       ]' 
for i in {0..25} 
do 
replace="${line/ /#}" 
line=$replace 
echo -ne "Cargando reproductor ${replace}" \\r 
sleep 1 
done 
if ! kill -0 "${children}" 1>/dev/null 2>&1; then 
    echo "Fallo en recepción" 
    exit 1 
else 
    vlc http://localhost:8908/tv.asf 1>/dev/null 2>&1 
    echo -ne "\033[2K" 
fi 

exit 0 
+0

Правильно ли было бы предположить, что ваш родной язык - это Python? :) –

+0

Во всяком случае - проверка 'kill -0 $ children' должна обнаруживать, когда произошел segfault, чтобы ваша ошибка кода была там, где есть. –

+0

Одна вещь, которую я хотел бы предложить, кстати, это избавиться от привычки использовать «echo -e' - см. Спецификацию POSIX для эха, http://pubs.opengroup.org/onlinepubs/009604599/utilities/ echo.html, особенно раздел ИСПОЛЬЗОВАНИЕ ПРИМЕНЕНИЯ; 'echo -e' несовместим как с POSIX, так и с расширенным POSIX. 'printf' - гораздо более портативный инструмент. –

ответ

1

errexitне может работы по программам работают в фоновом режиме, так что это не удивительно - inline-команда просто запускает фоновый процесс и что (запуск фонового процесса) завершается успешно, даже если сам процесс впоследствии завершился неудачно.

Если вы звоните wait $! впоследствии, затемerrexit сможет вступить в силу, как wait вызов будет выходить со статусом выхода из самой программы. (Конечно, если вы можете позвонить wait $!, тогда возникает вопрос, почему вы начали исходную программу для начала).


Если вы всегда хотите, чтобы убить родительский сценарий, если ребенок не работает, вы можете сделать это вместо того, чтобы:

(sp-sc-auth "$sopUrl" 8809 8908 >/dev/null || kill $$) & 

$$ оценивает в PID родительского оболочки, а не подоболочки, так что будут действовать соответственно.


Что касается самого Segfault, «программы X» ошибка сегментации является вопросом слишком расплывчат, чтобы решить здесь. Чтобы даже начать отлаживать это, вам нужно собрать основной дамп, созданный при его сбое (при необходимости включив ядра), установить символы отладки для sopcast и использовать gdb для сбора трассировки стека из файла ядра, созданного при ошибке.

+0

Спасибо, Чарльз !, я запустил sp-sc-auth в фоновом режиме, потому что я понятия не имею о bash, и мне нужно, чтобы эта программа выполнялась, а время до запуска vlc для воспроизведения потоковой передачи. Я покажу вам свой уродливый код в комментарии редактирования: – Diomedes