На этот вопрос уже есть ответ здесь:
Я использую Ubuntu Server 16.04. Каждый раз, когда я вхожу в систему, мне нужно вручную запускать мой сценарий: /home/user/ini.sh
. Этот сценарий вызывает другие сценарии, которым требуются разрешения sudo
, поэтому я получаю приглашение, вставляю свой пароль и готово. Теперь я хочу настроить способ автоматического запуска сценария при запуске системы.
Я использовал crontab -e
и добавил строку
@reboot /home/user/ini.sh
Это не работает. Я пробовал различные варианты, предложенные другими пользователями в здесь , здесь , здесь или здесь .
@reboot user /home/user/ini.sh
@reboot root /home/user/ini.sh
@reboot sh /home/user/ini.sh
*/1 * * * * /home/user/ini.sh
....
добавление SHELL = / bin / bash
...
Но я не могу заставить его работать. Я также пробовал
@reboot echo "yes" > /home/user/yes.txt
И файл создается - правда, пустой, без содержимого внутри (это демонстрирует, что что-то работает, но я где-то делаю ошибку).
Где моя ошибка?
ИЗМЕНИТЬ
Я также безуспешно пытался sudo crontab -e
и использовать
@reboot root /home/user/ini.sh
Существует большая разница между перезагрузкой и входом в систему, и Ваша система рассматривает их обоих вполне по-другому.
Задания ПЕРЕЗАГРУЗКИ выполняются полностью пользователь (не Ваш пользователь) и должны быть бездисплейными (никакой дисплей). Лучший способ делать работы времени начальной загрузки в 16,04 и более новый состоит в том, чтобы создать сервис и включать тот сервис в соответствующую цель systemd во время процесса начальной загрузки.
Задания ВХОДА В СИСТЕМУ выполняются Вашим пользователем (не корень) после ввода пароля. Лучший способ делать работы входа в систему состоит в том, чтобы разместить их в Ваш ~/.config/autostart/
каталог.
Но у Вас есть вторая проблема. Вы, кажется, хотите, чтобы задание уровня пользователя использовало сервисы корневого уровня. Существуют многие, много способов сделать это.
Самый легкий путь состоит в том, чтобы просто запустить Ваш скрипт как корень вручную каждый день. Вы уже знаете, как сделать это, поэтому давайте посмотрим на другие опции.
Самый быстрый путь состоит в том, чтобы взломать в sudoers
файл и генерирует специальный набор полномочий. Однако это не может скопировать правильно с остальной частью Вашей системы, AppArmor может заблокировать некоторые действия так или иначе, и трудно диагностировать и поддержать.
Соответствующий путь состоит в том, чтобы разделить Ваши функции уровня пользователя и корневого уровня на два отдельных сценария, и использовать dbus для запуска сценария корневого уровня и возврата, он производится. Это легко поддержать и диагностировать, но требует самого большого навыка и небольшого количества приобретения знаний о dbus.