В папке rc есть файлы, которые запускаются при загрузке?

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

Если вы хотите подсчитать количество обычных файлов и каталогов в вашем каталоге documentsили под ним, вы можете сделать это в оболочке zsh:

set -- documents/**/*(DN/) documents/**/*(DN.)
printf 'There are %d regular files and directories in or under "documents"\n' "$#"

Это устанавливает позиционные параметры ($1, $2и т. д. )на результат расширения двух шаблонов подстановки имен файлов documents/**/*(DN/)и documents/**/*(DN.), первый из которых будет соответствовать всем обычным файлы, в то время как второй соответствует каталогам (независимо от того, скрыты они или нет ). Шаблон **"рекурсивно" сопоставляется с подкаталогами.

После установки позиционных параметров специальная переменная $#будет содержать количество этих параметров.

В оболочке bash, которая не поддерживает квалификаторы glob(DN/)и (DN.), вы можете использовать цикл:

shopt -s globstar dotglob nullglob

count=0
for pathname in documents/**/*; do
    if [[ -f $pathname ]] || [[ -d $pathname ]]; then
       [[ ! -h $pathname ]] && count=$(( count + 1 ))
    fi
done

printf 'There are %d regular files and directories in or under "documents"\n' "$count"

Это немного сложнее, чем вариант zsh, но за ним легко следить. Сначала мы устанавливаем ряд опций оболочки, чтобы мы могли использовать **, чтобы мы считали скрытые имена и чтобы шаблон не разрешался, если нет совпадений (эти последние два равны Dи Nв квалификаторе zshglob ).

Внутри цикла мы проверяем, является ли текущий путь обычным файлом или каталогом, а не символической ссылкой. Если это обычный файл или каталог, мы учитываем его.

В shвы должны прибегнуть кfind:

find documents \( -type f -o -type d \) -exec echo. \; | wc -l

Мы ищем обычные файлы или каталоги в или под documents, и для каждой такой вещи мы выводим точку на отдельной строке. Затем wc -lподсчитывает количество созданных строк. Это позволяет избежать многократного подсчета имен файлов со встроенными символами новой строки.

Обратите внимание, что этот вариант также будет учитывать сам каталог documents.

0
01.06.2021, 19:50
1 ответ

/etc/rc.d/, упомянутый в инструкциях, на которые вы ссылаетесь, представляет собой в основном -исторический каталог, который когда-то использовался для группировки всех начальных -каталогов скриптов вверх :там должны были быть /etc/rc.d/init.d/, /etc/rc.d/rc0.d/, /etc/rc.d/rc1.dи так далее. В большинстве современных дистрибутивов уже давно принято решение опустить каталог rc.dи поместить другие каталоги непосредственно в /etc/.

/etc/rc0.d/должен содержать символические ссылки на сценарии (фактическое расположение сценариев должно быть /etc/init.d/), которые должны выполняться при выключении системы или питании -при выключении .

/etc/rc6.d/для ссылок на скрипты, которые должны выполняться при перезагрузке (, т. е. при выключении системы с целью немедленного повторного перезапуска, например, после установки обновления ядра ).

Наиболее подходящим каталогом для ссылки на ваш скрипт будет /etc/rc3.d/или /etc/rc5.d/, в зависимости от конфигурации вашей системы и уровня запуска по умолчанию для вашей системы (при использовании SysVinit ). Дистрибутивы Linux, основанные на Debian, обычно используют уровень запуска 3 для нормального многопользовательского -состояния (при использовании классического SysVinit ), в то время как дистрибутивы на основе RedHat/Fedora используют уровень запуска 5 для многопользовательского -состояния с включенным входом в систему через графический интерфейс, и уровень запуска 3 для многопользовательского состояния -с отключенной локальной подсистемой X11 GUI.

Имена символических ссылок в любых /etc/rc?.d/каталогах должны начинаться либо с прописной буквы -S, либо с прописной буквы -K, за которой следует (, обычно )двухзначный -номер. для определения относительного положения сценария в порядке запуска -среди других ссылок в этом каталоге. Верхний случай -S заставит систему запускать связанный сценарий с командой -строковый параметр start, а K заставит вместо этого использоваться параметр stop.

Итак, ваш скрипт должен был быть помещен в /etc/init.d/rc.local, а затем вы должны были сделать одну или обе символические ссылки, подобные этой:

ln -s /etc/init.d/rc.local /etc/rc3.d/S99rc.local
ln -s /etc/init.d/rc.local /etc/rc5.d/S99rc.local

Но это еще не все!

Современные дистрибутивы Linux, даже те, которые используют классический SysVinit вместо systemd, как правило, используют различные решения для распараллеливания выполнения различных задач запуска системы -, а не запускают их строго одну за другой. Это связано с тем, что на современных многоядерных процессорах -распараллеливание значительно ускоряет процесс загрузки. В этом случае вы должны добавить специально отформатированный блок комментариев в начале вашего скрипта, чтобы определить, от каких системных служб зависит ваш скрипт, иначе логика распараллеливания может запустить скрипт слишком рано , прежде чем требуемая система службы запускаются первыми.

Если в вашем дистрибутиве используется systemd, это особенно важно, так как даже в некоторых дистрибутивах «заводское значение» по умолчанию rc.localвыполняется довольно рано в процессе запуска -, если только вы не добавите подходящие определения зависимостей.

Текущие спецификации рекомендуемого блока комментариев для сценариев запуска/остановки в стиле SysVinit -см. в http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html.

В двух словах, вам может понадобиться нечто подобное в начале вашего rc.localскрипта:

### BEGIN INIT INFO
# Provides: rc.local
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: run locally-configured start-up commands
### END INIT INFO

На мой взгляд, Метод -1 в инструкции, на которую вы ссылаетесь , содержит неполный и старый совет.Два других метода могут быть проще для нового пользователя, но не содержат инструкций о том, как определить, применимы ли эти методы к тому или иному дистрибутиву.

0
28.07.2021, 11:27

Теги

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