
поэтому я пытаюсь запустить /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