Линукс симлинк не работает после перезагрузки
Я создал в нашем Debian свой собственный демон из скелета, где запускается мое приложение (+ я добавляю туда некоторые записи в мой лог-файл). Я поместил этот файл в /etc/init.d/
cp /home/ja /etc/init.d/ucloud-test -f
chown root /etc/init.d/ucloud-test
chmod 775 /etc/init.d/ucloud-test
После этого я создал символические ссылки на этот демон:
ln -sf ../init.d/ucloud-test /etc/rc0.d/K02ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc1.d/K02ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc6.d/K02ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc2.d/S17ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc3.d/S17ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc4.d/S17ucloud-test
ln -sf ../init.d/ucloud-test /etc/rc5.d/S17ucloud-test
Он создал следующие символические ссылки:
root@id135728-2:/home/ja# cd /etc
root@id135728-2:/etc# ls -l rc* | grep ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 K02ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 K02ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 S17ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 S17ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 S17ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 S17ucloud-test -> ../init.d/ucloud-test
lrwxrwxrwx 1 root root 21 Aug 7 13:15 K02ucloud-test -> ../init.d/ucloud-test
Если я пытаюсь прочитать некоторые из этих символических ссылок, он показывает код моего демона (это должно быть правильно).
root@id135728-2:/etc# cat rc0.d/K02ucloud-test
После перезагрузки похоже, что мой демон не выполняется (приложение не работает и в моем лог-файле ничего нет). Но если я запускаю этого демона, само приложение работает, и в моем журнале регистрируется логин.
/etc/init.d/ucloud-test start
Кто-нибудь знает, где может быть проблема? Спасибо Роман
1 ответ
Трудно сказать, что может происходить без дальнейшей отладки (что означало бы обширную регистрацию в самом скрипте, чтобы выяснить, что не так, как вы ожидаете), но действительно хорошее место, чтобы начать с такого рода проблем на Squeeze: документация по соглашениям о комментариях сценариев инициализации, которые помогают управлять зависимостями. Потому что, в 99% случаев, если ваш скрипт инициализации "просто работает" после загрузки, это проблема зависимости.
Что вы используете для регистрации, требуется ли запуск? Как насчет сети? Может быть, для этого нужно подключиться к базе данных? Ваш загрузочный скрипт обязательно должен быть запущен позже.
Вместо того, чтобы делать ссылки вручную, попробуйте добавить это в верхней части вашего скрипта инициализации:
### BEGIN INIT INFO
# Provides: ucloud-test
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Description: Test script that needs to run after boot
### END INIT INFO
Затем беги insserv ucloud
(обратите внимание, я устранил уровни выполнения 1 и 6)
Теперь, если выяснится, что все, что вам нужно, это установить сеть (это включает в себя петлевые устройства и мосты!!!) (что, я подозреваю, так), тогда вы можете изменить $all
в $network
, но это может быть сложно с расширенными сетевыми настройками. Если это так, вы, вероятно, должны проверить более детальные загрузочные хуки (systemd / systemctl
).
Другая вещь, которую нужно сделать, это сделать /etc/ucloud-test/ucloud-defaults
и включите его в свой скрипт после информации init вместо того, чтобы полагаться на другие вещи, чтобы поместить их в окружение, но я сильно подозреваю, что вам просто нужно подождать до тех пор, пока не начнется процесс загрузки.
Во всяком случае, это должно дать вам основу, чтобы понять это. Ключевым выводом является то, что не создавайте вручную ссылки инициализации, если у вас нет очень конкретной причины для этого, которая влечет за собой нежелание какого-то особого поведения, которое могут принести системные утилиты для управления этим.