Что делает puppet, чтобы исправить «зависшую» службу systemctl, когда systemctl отказывается запускать службу?

Оболочка

Загрузка языка более высокого уровня требует времени.
Для нескольких строк сама оболочка может быть решением.
Мы можем использовать внешнюю команду sortи команду tr. Один достаточно эффективен для сортировки строк, а другой эффективен для преобразования одного разделителя в символы новой строки :

.
#!/bin/bash
shsort(){
           while IFS='' read -r line; do
               echo "$line" | tr "$1" '\n' |
               sort -n   | paste -sd "$1" -
           done <<<"$2"
    }

shsort ' '    '10 50 23 42'
shsort '.'    '10.1.200.42'
shsort ','    '1,100,330,42'
shsort '|'    '400|500|404'
shsort ','    '3 b,2       x,45    f,*,8jk'
shsort '.'    '10.128.33.6
128.17.71.3
44.32.63.1'

Это необходимо bash из-за использования только <<<. Если его заменить документом -, решение подходит для posix.
Это позволяет сортировать поля с помощью табуляции, пробелов или символов оболочки (*, ?, [). Не новые строки, потому что каждая строка сортируется.

Измените <<<"$2"на <"$2", чтобы обрабатывать имена файлов и называть их как:

shsort '.'    infile

Разделитель одинаков для всего файла. Если это ограничение, его можно улучшить.

Однако файл, содержащий всего 6000 строк, обрабатывается 15 секунд. Действительно, оболочка — не лучший инструмент для обработки файлов.

Ок

Для более чем нескольких строк (более нескольких десятков )лучше использовать настоящий язык программирования. Решение awk может быть:

#!/bin/bash
awksort(){
           gawk -v del="$1" '{
               split($0, fields, del)
               l=asort(fields)
               for(i=1;i<=l;i++){
                   printf( "%s%s", (i==0)?"":del, fields[i] )
               }
               printf "\n"
           }' <"$2"
         }

awksort '.'    infile

Что занимает всего 0,2 секунды для того же файла из 6000 строк, упомянутого выше.

Поймите, что <"$2"для файлов может быть изменен обратно на <<<"$2"для строк внутри переменных оболочки.

Перл

Самое быстрое решение — perl.

#!/bin/bash
perlsort(){  perl -lp -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' <<<"$2";   }

perlsort ' '    '10 50 23 42'
perlsort '.'    '10.1.200.42'
perlsort ','    '1,100,330,42'
perlsort '|'    '400|500|404'
perlsort ','    '3 b,2       x,45    f,*,8jk'
perlsort '.'    '10.128.33.6
128.17.71.3
44.32.63.1'

Если вы хотите отсортировать файл, измените <<<"$a"на просто "$a"и добавьте -iв параметры Perl, чтобы сделать редактирование файла «на месте»:

#!/bin/bash
perlsort(){  perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }

perlsort '.' infile; exit
0
15.11.2019, 13:08
1 ответ

Я получил доступ к логам journaldи выяснил следующее.

Интересно, что служба не запустится, если диск заполнен.

Марионетка во время работы может выбрать запуск

yum clean all

Что устраняет проблему и позволяет запустить службу.

0
28.01.2020, 03:06

Теги

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