Я создал файл в формате /etc/rc0.d
, назвал его rc.local
.
В этом файле я добавил строку, которая запускает другой файл, который я поместил в Desktop
. Я сделал все это для того, чтобы команда могла быть запущена при загрузке. Я следовалинструкции в этой статье(первый способ), но ничего не работает.
Почему это не работает?
решение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 для многопользовательского состояния с включенным входом через GUI и уровень запуска 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
выполняются довольно рано в процессе запуска, если вы не добавите подходящие определения зависимостей.
Видетьhttp://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/initscrcomconv.htmlдля получения текущих спецификаций рекомендуемого блока комментариев для сценариев запуска/завершения работы в стиле SysVinit.
Короче говоря, в начале вашего 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 винструкции, на которые вы ссылалисьсодержит неполные и старые советы. Другие два метода могут быть проще для нового пользователя, но не включают инструкции о том, как определить, применимы ли эти методы или нет в любом данном дистрибутиве.