Где находится основной файл с установленным abrt-hook-cpp?

Вам необходимо внести некоторые изменения в ваш скрипт (без особого порядка):

  • Используйте IFS= перед read, чтобы избежать удаления ведущих и корявых пробелов.
  • Поскольку $line нигде не изменяется, нет необходимости в переменной readLine.
  • Не используйте read в середине цикла!!!
  • Используйте булеву переменную для управления печатью.
  • Четко определите начало и конец печати.

С этими изменениями скрипт становится:

#!/bin/bash

filename="foo.txt"

#While loop to read line by line
while IFS= read -r line; do
    #If the line starts with ST then set var to yes.
    if [[ $line == qwe* ]] ; then
        printline="yes"
        # Just t make each line start very clear, remove in use.
        echo "----------------------->>"
    fi
    # If variable is yes, print the line.
    if [[ $printline == "yes" ]] ; then
        echo "$line"
    fi
    #If the line starts with ST then set var to no.
    if [[ $line == ewq* ]] ; then
        printline="no"
        # Just to make each line end very clear, remove in use.
        echo "----------------------------<<"
    fi
done < "$filename"

Который можно сократить так:

#!/bin/bash
filename="foo.txt"
while IFS= read -r line; do
    [[ $line == qwe* ]]       && printline="yes"
    [[ $printline == "yes" ]] && echo "$line"
    [[ $line == ewq* ]]       && printline="no"
done < "$filename"

Который будет печатать начальную и конечную строки (включительно).
Если нет необходимости печатать их, поменяйте местами начальный и конечный тесты:

#!/bin/bash
filename="foo.txt"
while IFS= read -r line; do
    [[ $line == ewq* ]]       && printline="no"
    [[ $printline == "yes" ]] && echo "$line"
    [[ $line == qwe* ]]       && printline="yes"
done < "$filename"

Однако, лучше (если у вас bash версии 4.0 или лучше) использовать readarray и выполнить цикл с элементами массива:

#!/bin/dash
filename="infile"

readarray -t lines < "$filename"


for line in "${lines[@]}"; do
    [[ $line == ewq* ]]       && printline="no"
    [[ $printline == "yes" ]] && echo "$line"
    [[ $line == qwe* ]]       && printline="yes"
done

Это позволит избежать большинства проблем, связанных с использованием read.


Конечно, вы можете использовать рекомендуемую (в комментариях; спасибо, @costas) строку sed, чтобы получить только строки для обработки:

    #!/bin/bash
filename="foo.txt"

readarray -t lines <<< "$(sed -n '/^qwe.*/,/^ewq.*/p' "$filename")"

for line in "${lines[@]}"; do

     : # Do all your additional processing here, with a clean input.

done 
6
09.03.2017, 23:45
2 ответа

Одна из возможностей - это необходимость изменить строку в файле конфигурации /etc/abrt/abrt-action-save-package-data.conf

ProcessUnpackaged = no

- да , в противном случае abrtd будет захватывать файлы ядра только из программ , установленных диспетчером пакетов ( dnf , apt или что-то еще) . Используйте abrt-gui или abrt-cli для поиска дампов ядра.

6
27.01.2020, 20:28

Помимо того, что сказал Меух,как только информация о сбое будет собрана демоном abrt (после его перезапуска, как только вы измените упомянутый файл конфигурации ), вы можете использовать abrt -cli или abrt -gui, чтобы увидеть, где находится эта информация.

# abrt-cli -a ls
id xxxxxxxxxxxxxxxxxx
reason:         MYPROGRAM killed by SIGABRT
time:           Thu 10 Jan 2019 11:48:07 AM CET
cmdline:       ./myExecutable
uid:            1001
Directory:      /var/spool/abrt/ccpp-2019-01-10-11:48:07-17559
Run 'abrt-cli report /var/spool/abrt/ccpp-2019-01-10-11:48:07-17559' for creating a case in Red Hat Customer Portal

В указанном каталоге вы найдете файл coredump.

1
27.01.2020, 20:28

Теги

Похожие вопросы