Как включить скрипт init.d в автономном режиме?

Попробуйте:

for dir in ~/Documents/CMDsh/*/
do
    countFolder=$((countFolder+1))
    dir=${dir%*/}
    nameFolder=${dir##*/}
    zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
    echo '------------------------------';
done

Примечания:

  1. Всегда заключайте ссылки на переменные оболочки в двойные -кавычки. В данном случае это означало замену:

    zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
    

    с

    zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
    

    Это избавляет от необходимости пытаться экранировать эти три строки кода sed.

    Единственным исключением из этого правила является то, что вы явно хотите разбиения слов или расширения имени пути .

  2. Пример может помочь. Рассмотрим простой пример с директорией с одним файлом:

    $ ls
    Sensation (TV Size)
    

    Давайте создадим переменную оболочки:

    $ f='Sensation (TV Size)'
    

    Теперь давайте попробуем использовать переменную оболочки без кавычек:

    $ ls $f
    ls: cannot access 'Sensation': No such file or directory
    ls: cannot access '(TV': No such file or directory
    ls: cannot access 'Size)': No such file or directory
    

    Обратите внимание, насколько лучше это работает, когда переменная оболочки заключена в кавычки:

    $ ls "$f"
    Sensation (TV Size)
    

    При заключении переменной оболочки в кавычки экранирование не требуется.

  3. Оболочка интерпретирует конец строки как конец команды. Таким образом, хотя точки с запятой в конце строки и не мешают, они излишни.

0
01.09.2021, 16:34
1 ответ

Во-первых, "Debian 4.19" не существует :вы, вероятно, смотрите на систему Debian с ядром Linux версии 4.19 , что означает, что это Debian 10("buster ", выпуск, ставший "старым стабильным" как Debian 11, был выпущен всего около двух недель назад ).

Debian использует systemdначиная с Debian 8, но они по-прежнему поддерживают некоторую совместимость с SysVinit и возможность замены systemdдругими системами инициализации... хотя я не знаю, насколько практично было бы на самом деле использовать SysVinit в Debian 10, так как многие системные интеграции теперь выигрывают или зависят от systemd. Но systemdв Debian 10 (, а также 11 )по-прежнему имеет полный механизм совместимости для сценариев init.d, поэтому этот ответ должен применяться независимо от того, какая система инициализации используется.

Итак, у вас есть диск, содержащий корневой раздел установки Debian 10, например. /dev/sdXNи вы хотите изменить его, чтобы добавить сценарий init.d до того, как эта система действительно загрузится.

Вы можете смонтировать диск в другой системе:

mount /dev/sdXN /mnt

Затем скопируйте ваш скрипт в каталог /etc/init.d/новой установки:

cp /some/where/myscript /mnt/etc/init.d/
chmod a+rx /mnt/etc/init.d/myscript

Примечание :Для systemdсовместимости ваш скрипт должен включать блок комментариев в стиле LSB -в начале, чтобы документировать его зависимости и предотвратить systemdслишком ранний запуск его в начале -вверх процесс. См. эту статью Debian Wiki илиinsserv(8)справочную страницу для более подробной информации.

По сути, ваш скрипт должен иметь подобный блок комментариев в начале скрипта перед любыми другими не -строками комментариев:

### BEGIN INIT INFO
# Provides:          myscript
# Required-Start:    $local_fs $syslog $network
# Required-Stop:     $local_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start myscript at boot time
# Description:       Enable service provided by myscript.
### END INIT INFO

Вы должны настроить строки Required-Startи Required-Stopв соответствии с требованиями вашего скрипта.

Как только ваш сценарий будет готов, вы можете chrootвойти в новую установку, чтобы запустить инструментupdate-rc.dдля создания символических ссылок init.d. Но перед фактической командой chroot вы должны смонтировать /proc,/sysи /devфайловые системы, иначе вы мало что сможете сделать:

mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o rbind /dev /mnt/dev
chroot /mnt /bin/bash  # From this point on, /mnt will be this session's root directory

Теперь ваш сеанс будет выполняться «внутри» среды новой установки, и вы сможете использовать большинство инструментов этой установки так же, как если бы система уже выполняла новую установку. Итак, вы можете использовать команду update-rc.d:

/usr/sbin/update-rc.d myscript defaults

После этого вы можете отменить chroot и размонтировать корневую файловую систему новой установки, чтобы корректно завершить процедуру:

exit  # back to having the real root directory
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt

(Процедура монтирования корневой файловой системы неактивной установки применима для многих ситуаций обслуживания и устранения неполадок, таких как исправление поврежденного загрузчика или изменение утерянного пароля root. В этом конкретном случае, возможно, нет необходимости монтировать /procи /sysв неактивной установке... но я решил показать процедуру chroot в "универсальной" форме, чтобы ее было легче применить к другим ситуации тоже.)

0
02.09.2021, 13:16

Теги

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