Сценарий оболочки во время цикла: [вокруг конвейера отсутствует `]'

Префикс rc -эти две буквы обозначают статус пакетов следующим образом:

  1. r:пакет помечен для удаления
  2. c:файлы конфигурации присутствуют в системе

Сначала нам нужно получить список пакетов, которые были удалены, оставив конфигурацию:

dpkg --list | grep "^rc  linux-image" | cut --delimiter " " --fields 3

Получив список, мы можем вручную очистить эти пакеты ядра, например.:

sudo apt-get purge linux-image-4.10.0-20-generic linux-image-extra-4.10.0-20-generic

Заметьте, на самом деле мы всегда удаляем два пакета:

  1. линукс -изображение-*
  2. linux -изображение -дополнительное-*

Одной из проблем, с которой вы, возможно, столкнетесь, является предупреждение о том, что каталог библиотеки ядра не был удален, поскольку он не пуст. Я решил, что оставлю все как есть, потому что мне придется гуглить еще час для объяснения, могу ли я просто:

sudo rm -rf /lib/modules/4.10.0-20-generic/
4
13.02.2019, 07:39
1 ответ

У вас не может быть трубы внутри [... ]. Также лучше использовать pgrep, чем пытаться анализировать выводps:

count=0
while [ "$count" -lt 10 ] && pgrep relayevent.sh >/dev/null; then
    sleep 3
    count=$(( count + 1 ))
done

Системы BSD могли бы использовать pgrep -q...вместо pgrep... >/dev/nullдля отбрасывания фактического вывода pgrep, как и в случае обычногоgrep(нас интересует только статус выхода ).

Обратите внимание, что мы не помещаем команду pgrepв [... ]. Это потому, что нас не интересует его вывод, а только его статус выхода. С помощью [... ]вы обычно сравниваете строки или числа. [... ]приведет к статусу выхода, который будет нулевым (истинным )или не -нулевым (ложным ), точно так же, как выполнение pgrep.

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

Если вы пытаетесь запустить только один экземпляр скрипта,тогда лучше сделать что-то вроде этого (, предполагая, что ловушка EXITвыполняется всякий раз, когда сценарий завершается по порядку):

lockdir=dir.lock

if mkdir "$lockdir"; then
    trap 'rmdir "$lockdir"' EXIT
else
    echo 'Only one instance of this script allowed' >&2
    exit 1
fi

С несколькими попытками и сном:

lockdir=dir.lock

count=0
while [ "$count" -lt 10 ]; then
    if mkdir "$lockdir"; then
        trap 'rmdir "$lockdir"' EXIT
        break
    else
        echo 'Locked. Sleeping...' >&2
        sleep 3
    fi

    count=$(( count + 1 ))
done

if [ "$count" -eq 10 ]; then
    echo 'Giving up.' >&2
    exit 1
fi

Связанные:

2
27.01.2020, 20:48

Теги

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