Как я могу запустить rc.local при запуске?

75

У меня есть скрипт, который я хотел бы запустить при запуске моей системы. Я поставил его на "rc.local", но он не работает. Как я могу включить его при запуске?

pedroo
источник
1
Где находится команда xsetwacom? /etc/rc.local запускается с очень простым PATH при запуске. Возможно, он отличается от PATH, в который вы вошли в терминал. В терминале введите: type -p xsetwacom, затем замените команду «xsetwacom» в /etc/rc.local на полный путь, возвращаемый «type -p». Вам нужно выполнить какие-либо ручные инициализации, прежде чем xsetwacom будет работать для вас?
Вальтинатор
3
Используя systemd в качестве менеджера автозагрузки, убедитесь, что работает совместимость с rc.local:systemctl status rc-local.service
rubo77
Комментарий вальтинатора был моей проблемой. Из-за минимального пути он не знал, как запускать сценарии, которые я хотел запустить. Путь, загруженный в мою систему Ubuntu 14.04 во время запуска /etc/rc.local, был следующим: / sbin: / usr / sbin: / bin: / usr / bin ... вы можете проверить свой, вставив echo $PATH > /home/rc_local_pathв свой / etc / rc.local, а затем проверяет файл после его запуска при запуске.
RaisinBranCrunch
Имейте в виду, что если ваш скрипт должен работать постоянно, вы должны запустить его какrc.local файл в файле!
Тотемедли
Используйте, sudo systemctl enable rc-local.serviceчтобы убедиться, что /etc/rc.local выполняется во время запуска сервера
Уильям

Ответы:

56

Можете ли вы запустить свой скрипт вручную? Если нет, то это проблема с этим скриптом; в противном случае посмотрите больше на rc.local. (Если этот скрипт должен запускаться с правами root, вам нужно использовать sudo для его запуска вручную.)

Убедитесь, что /etc/rc.local является исполняемым и что вызываемый им скрипт также является исполняемым.

$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 419 2010-08-27 11:26 /etc/rc.local

Убедитесь, что rc.local имеет строку shebang (по умолчанию):

$ head -n1 /etc/rc.local
#!/bin/sh -e

источник
Да, я могу запустить скрипт вручную. Как я могу убедиться, что /etc/rc.local является исполняемым? Что я должен печатать? Это "$ ls -l /etc/rc.local -rwxr-xr-x 1"? Спасибо!
Pedroo
@pedroo: я скопировал именно то, что вижу в своем терминале (так что вы видите подсказку, ввод и вывод всего выше). Это команда "ls -l /etc/rc.local", и, если она выполнима, она будет иметь эти X в выходных данных.
3
Я пробовал "ls -l /etc/rc.local", и он исполняемый, но я не могу запустить его при запуске ... Есть идеи?
Pedroo
1
@pedroo: для этого требуется запустить X-сервер, чего не происходит при выполнении rc.local. Запуск его из rc.local просто завершит работу, ничего не делая (хотя я надеюсь, что он поместит сообщение в системный журнал или где-либо еще). Вам нужно вместо этого поместить команды xsetwacom в ~ / .xinitrc или / etc / X / xinit / xinitrc.
1
@pedroo: потому что rc.local содержит команды, предназначенные для запуска в другое время. Создайте новый файл, вы можете поместить его в ~ / bin , отметить его исполняемым (chmod или свойства в Nautilus), сделать первую строку "#! / Bin / bash", а затем поместить свои команды в более поздние строки.
53

В моем случае ни одна из инструкций не была идеальным решением. Если вам не повезло, как мне, попробуйте этот подробный

  1. Поместите весь исполняемый код в отдельный текстовый файл с произвольным именем, например, foo.sh, и сохраните его в произвольном месте.
  2. Добавлять

    #!/bin/sh

    как первая строка вашего кода.

  3. Попробуйте запустить свой foo.sh

    sudo foo.sh

    проверить нет ошибок вообще.

  4. Укажите в вашем скрипте /etc/rc.local полный путь и имя созданного вами скрипта после команды sh

    sh '/path/to/your/script/foo.sh'
  5. Не забудьте поставить вышеуказанную строку перед последней строкой кода

    exit 0

    в конце скрипта /etc/rc.local.

  6. Проверьте первую строку /etc/rc.local, чтобы быть

    #!/bin/sh -e
  7. Сделайте ваш /etc/rc.local исполняемым, если он еще не выполняется

    sudo chown root /etc/rc.local
    sudo chmod 755 /etc/rc.local
    
  8. Проверьте все работает нормально, выполнив

    sudo /etc/init.d/rc.local start
  9. Тест перезагрузите вашу систему.
shvahabi
источник
6
Шаг № 8 был ключом, подтверждающим, что скрипт будет работать в среде запуска. В моем случае мне нужно указать полный путь к команде.
Питер Глюк
Префект и шаг за шагом великие, это работает на Centos, но sudo /etc/rc.local startпервый запуск.
A1Gard
Спасибо - эта поломка действительно помогла мне, и, как и выше, шаг № 8 был ключевым для меня тоже! Без этого он не будет перенаправлять +1 (для справки, приложение узла, работающее на облачном сервере bitnami, использует навсегда для непрерывной работы).
Фидев
Шаг 8 был хорошим советом, но я думаю, что шаг 7 может быть тем, что исправило мой, я пытался запустить сценарий, используя cron, чтобы открыть туннель, но он не
удался
28

В более новых версиях Ubuntu systemdиспользуется и /etc/rc.localне загружается всегда по умолчанию.

Проверьте, загружен ли сервис совместимости с

systemctl status rc-local.service

Скриншот

Если он содержит активный (выход), ваши настройки кажутся нормальными, и у вас может быть другая ошибка в вашем /etc/rc.localфайле (например, это может быть команда, которая терпит неудачу).

rubo77
источник
4
если rc-local.service не активирован, проверьте этот пост, в котором объясняется, как включить /etc/rc.local с помощью Systemd
yaitloutou
3

2 предложения.

  1. Убедитесь, что целевой файл сценария также помечен как исполняемый.
  2. Целевой скрипт выполняет команду sudo ? Если это так, вы можете предоставить ему пароль sudo.

Виноват. Просто отметьте один. Спасибо за исправление энзотиба :)

Анкит
источник
8
rc.localзапускается от имени пользователя root, поэтому пароль не требуется.
энзотиб