Невозможно заставить rc.local автоматически запускаться.

Невозможно заставить rc.local автоматически запускаться.

поэтому я пытаюсь запустить /etc/rc.localскрипт, и, увы, ничего не получается. Я могу запустить его вручную с помощью service rc.local start, и он просто выводит 'hi' в файл в моем домашнем каталоге, но при перезагрузке он не запускается. Все правильные разрешения, похоже, установлены, и ссылки существуют в правильных каталогах rc#.d. Для справки, вот соответствующая информация:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local


# ls -l /etc/init.d/rc.local                                  
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local


# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local


# cat /etc/rc.local
#! /bin/bash

echo hi > ~user/test

exit 0

Я пробовал удалить и то , /etc/rc.localи другое /etc/init.d/rc.local, запустить update-rc.d rc.local remove, затем восстановить их и запустить, update-rc.d rc.local defaultsкак в этом вопросе:Rc.local не выполняется. Это не сработало.

Он также не работает после перезагрузки или входа в любой уровень инициализации. Он не работал, когда строка shebang читала #! /bin/sh -eили #! /bin/bash. Если я запускаю его вручную, я могу заставить /etc/rc.localи /etc/init.d/rc.localскрипты и выводить эхо в разные файлы.

Итак, мой вопрос... что я делаю не так и как мне заставить rc.local работать? Кроме того, хотя я не против услышать об альтернативах (типа upstart), я приму только тот ответ, который покажет мне (или поможет мне найти), как заставить rc.local работать нормально (и в идеале скажет мне, что пошло не так).

Вот некоторая дополнительная информация, которая может оказаться полезной:

# dmesg | grep "Linux version"
[    0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)


# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012

# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 14 Nadia
Release:        14
Codename:       nadia

решение1

Проблема в том, что в этой строке:

echo hi > ~user/test

~userне расширяется так, как вы ожидаете. rc.localработает, но из-за неожиданного расширения пытается записать данные в место, на которое у него, вероятно, нет разрешения.

Вместо этого попробуйте следующее:

echo ~user/test > /dev/shm/test

Затем проверьте содержимое /dev/shm/test. Это покажет и то, что rc.localвыполняется, и то, ~userво что он расширяется.

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

решение2

"Я не против услышать об альтернативах (типа upstart)" подразумевает, что вы не понимаете пару вещей. Я не пользователь Mint, но, судя по всему, это система на основе Upstart. Upstart — это демон init, и в вашей системе установлен только один. Так что Upstart — это не альтернатива; альтернатив нет —ваша система использует upstart. Точка. Он не использует ничего другого. Однако upstart включает обратную совместимость со скриптами sysvinit, что означает, что вы можете управлять службами, размещая ссылки в каталогах /etc/rc и использовать некоторые старые команды, такие как serviceи, возможно, update-rc.d.

Поскольку вы, по собственному признанию, не очень хорошо понимаете, как работает система sysvinit, я думаю, что это пустая трата времени для вас, чтобы учиться. Вы могли бы также узнать, как работает ваш настоящий демон init. Upstart довольно прост; имейте в виду, что 95% жалоб, которые идут по поводу него (и параллельных жалоб на systemd в системах, производных от fedora), принадлежат просто людям, которые имеют базовое представление о sysvinit и злятся, что им, возможно, придется потратить пару часов на изучение чего-то нового.

Итак, я бы посоветовал проверить каталоги rc и т. д. на наличие ссылок в стиле sysvinit, но судя по вопросу "Rc.local не выполняется", на который вы ссылаетесь, чье решение, как вы говорите, не удалось, я думаю, что вы напрасно тратите время на это. Забудьте о совместимости с sysvinit и каталогах /etc/rc и init.d.

Upstart обрабатывает .confфайлы в /etc/init(примечание: не init.d). Так что, если у вас есть какой-то скрипт, который вы хотите запустить при загрузке, просто добавьте файл .conf в /etc/init. Он не обязательно должен быть исполняемым, но его владельцем должен быть root.

author "You"

start on started local-filesystems

script
    /etc/rc.local # but don't really be this lazy, see below
end script

Чтобы избежать путаницы и дальнейших махинаций с sysvinit в будущем, я рекомендую вам изменить имя скрипта /etc/rc.local на что-нибудь другое или, что еще лучше, просто переместить все его содержимое в файл .conf (все, что находится между тегами scriptи , end scriptобрабатывается оболочкой).

Окончательным справочником по upstart, вероятно, являетсякулинарная книга выскочки. Как я уже сказал, это улучшение, с точки зрения удобства использования, по сравнению с sysvinit, но, к сожалению, в сети все еще мало приличного материала о нем, и много запутанных и неполных вещей. Но запустить скрипт при загрузке так же просто, как только что описано.

Если файл .conf называется "my-localboot.conf", вы можете протестировать свою службу с помощью

initctl start my-localboot

Связанный контент