Ubuntu автозапуск скрипта от root
После запуска компьютера, как правило, нам приходится запускать некоторые программы. которыми мы пользуемся чаще всего. Также после запуска системы нам может понадобиться выполнить какие-либо специфичные действия, например, создать нужные файлы или установить некоторые параметры. Очень неудобно делать это вручную. Для решения таких задач существует автозагрузка.
В этой статье мы рассмотрим как работает автозагрузка Linux, как добавить программы автозагрузки, куда их будет более правильно добавить, а также какие виды автозагрузки бывают в этой операционной системы.
Как работает автозагрузка?
Чтобы понять как работает автозагрузка, сначала нужно вспомнить, что происходит во время процесса загрузки Linux. Как только ядро завершит свою инициализацию и будет готово к дальнейшей работе, оно передаст управление системе инициализации. Система инициализации - это основной процесс, именно он запускает все другие процессы в системе.
Есть процессы, которые система инициализации, например, systemd, запускает по умолчанию, но также вы можете настроить чтобы она запускала нужные вам процессы. Также многими дочерними процессами выполняются файлы скриптов или имеется та или иная возможность запускать необходимые вам программы. Такая возможность есть и у большинства окружений рабочего стола.
Рассмотрим основные уровни автозагрузки которые вы можете использовать:
- Автозагрузка на уровне ядра - вы можете указать любую программу, которая будет запускаться после старта ядра вместо системы инициализации;
- Автозагрузка системы инициализации - запуск основных системных сервисов, дополнительных сервисов, а также ваших скриптов на этапе инициализации системы;
- Автозагрузка rc.local - устаревший метод загрузки скриптов, выполняется перед запуском графического окружения;
- Автозагрузка менеджера входа - вы можете выполнять свои скрипты или команды после запуска менеджера входа, но перед запуском окружения;
- Автозагрузка X сервера - запуск нужных программ или скрпитов сразу после старта X сервера;
- Автозагрузка окружения - большинство окружений поддерживают автозагрузку программ, там даже можно настроить отложенный запуск и другие параметры;
- Автозагрузка bash - самый последний вариант - это автозагрузка на уровне отдельной командной оболочки, вы можете выполнять нужные команды автоматически, как только будет запущен терминал.
Дальше мы рассмотрим более подробно как использовать каждый из пунктов для автозагрузки программ, скриптов или выполнения команд в Linux.
Автозагрузка на уровне ядра
sudo vi /boot/grub2/grub.cfg
linux /vmlinuz-4.8.0-22-generic root=/dev/mapper/systems-ubuntu ro quiet init=/bin/bash
Но, обычно, удобнее изменить это значение временно, в меню Grub. Читайте подробнее об этом в статье параметры ядра Linux. Так не выполняется автозагрузка программы linux, но, тем не менее, иногда может быть полезно.
Автозагрузка в системе инициализации
Чаще всего, когда говорится автозагрузка Linux, подразумевается именно автозагрузка сервисов с помощью системы инициализации. В systemd очень продвинутая система управления службами. Здесь поддерживается разрешение зависимостей, параллельный запуск, отсрочка запуска и перезапуск при ошибке. В терминологии Systemd все запускаемые программы представлены файлами юнитов, в каждом юните описаны параметры программы, ее исполняемый файл, а также дополнительные требования к запуску.
Для добавления или удаления служб из автозапуска используется команда systemctl. Чтобы добавить службу в автозапуск выполните:
sudo systemctl enable имя_службы
А чтобы отключить ее автозапуск linux:
sudo systemctl disable имя_службы
Например, если вы хотите добавить в автозагрузку Apache, то нужно выполнить:
sudo systemctl enable apache
Также вы можете проверить добавлена ли уже служба в автозагрузку:
Если вы не знаете точное имя файла сервиса, но знаете его первую букву, то можно использовать автодополнение, как и в любом другом месте терминала с помощью кнопки Tab:
Также вы можете посмотреть все сервисы, которые были добавлены в автозагрузку с помощью команды:
systemctl list-unit-files | grep enabled
Автозагрузка скриптов в Linux
Раньше было принято размещать все скрипты, которые запускаются по умолчанию в файле /etc/rc.local. Этот файл все еще существует, но это пережиток системы инициализации SysVinit и теперь он сохраняется только для совместимости. Скрипты же нужно загружать только с помощью Systemd.
Для этого достаточно создать простой юнит-файл и добавить его в автозагрузку, как любой другой сервис. Сначала создадим этот файл:
sudo vi /lib/systemd/system/runscript.service
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/local/script.sh
[Install]
WantedBy=multi-user.target
В секции Unit мы даем краткое описание нашему файлу и говорим с помощью опции After, что нужно запускать этот скрипт в многопользовательском режиме (multi-user). Секция Service самая важная, здесь мы указываем тип сервиса - idle, это значит, что нужно просто запустить и забыть, вести наблюдение нет необходимости, а затем в параметре ExecStart указываем полный путь к нашему скрипту.
Осталось выставить правильные права:
sudo chmod 644 /lib/systemd/system/runscript.service
Затем обновить конфигурацию и добавить в автозагрузку Linux новый скрипт:
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
После следующей перезагрузки этот скрипт будет запущен автоматически. Обратите внимание, что для каждого скрипта, который вы собираетесь запускать должны быть правильно выставлены права, а именно нужно установить флаг выполнения. Для этого используйте команду chmod:
sudo chmod u+x /usr/local/bin/script
В параметрах мы передаем утилите адрес файла скрипта. Исполняемость - это обязательный параметр для всех способов.
Автозагрузка X сервера
Часто, в легких окружениях рабочего стола и оконных менеджеров для автозагрузки программ используется автозагрузка на уровне X сервера. Все запускаемые, таким образом, скрипты будут стартовать после запуска X сервера. Чтобы настроить такую автозагрузку Linux вам будет достаточно добавить путь к нужному скрипту в файл
/.xinitrc или /etc/X11/xinit/xinitrc. Синтаксис добавляемой строки таков:
exec путь_к_скрипту &
/.xinitrc еще не существует, то его нужно создать:
Затем, чтобы добавить в автозагрузку linux скрипт, отредактируйте файл так, как вам нужно. Например, будем запускать Firefox:
Готово. Осталось сохранить изменения. При следующем запуске X сервера сработает автозапуск Linux и выполняется эта команда. Таким же способом может выполняться автозапуск приложений linux.
Автозагрузка окружения рабочего стола
Такие мощные окружения рабочего стола как Gnome и KDE имеют свои приложения для автозагрузки. Например, в Gnome программа называется "Запускаемые автоматически приложения". Вы можете запустить ее из главного меню системы:
Здесь вы видите все программы, которые уже добавлены в автозагрузку. Вы можете отключить каждую из них просто сняв галочку.
Чтобы добавить новую программу или скрипт в автозагрузку нажмите кнопку "Добавить":
Тут вам нужно заполнить три поля:
- Имя - произвольное имя для команды, по которому вы сможете ее найти;
- Команда - полный путь к исполняемому файлу программы;
- Комментарий - дополнительная информация, указывать необязательно.
Дальше нажмите "Добавить" ваша программа появится в списке. При следующей загрузке системы, будет выполняться автозагрузка программ linux.
Автозагрузка Bash
Самый простой автозапуск скрипта linux - это запуск с помощью bashrc. Ваш скрипт или команда будет выполняться каждый раз, когда запускается новая сессия терминала. Для этого добавьте адрес нужного скрипта в файл
/usr/bin/local/script
export MYWAR=test
Здесь вы можете запускать на выполнение любые скрипты или команды. Часто такой подход используется для создания псевдонимов команд, объявления новых переменных и собственных функций.
Выводы
В этой статье мы рассмотрели добавление в автозагрузку linux, а также как работает автозагрузка и ее виды. Конечно, существует множество других файлов, куда бы вы могли пристроить свой скрипт, но это будет неправильно. Нужно использовать только предназначенные для этого методы, хотя бы потому, чтобы потом не забыть. Если у вас остались вопросы, спрашивайте в комментариях!
Для реализации автозапуска в Linux написано уже немало и на разных языках, но приходится искать, потому постарался свести большую часть тут. Здесь не рассказывается полностью весь процесс с нуля, но предоставлено достаточно информации и ссылок, чтобы сделать атоматический запуск программ в Linux реальностью.
Стоит сразу заметить — чтобы программа была полноценным сервисом/демоном, она должна быть соответствующе написана (link1, link2). Впрочем такое делают не всегда, хотя возможно это и не совсем правильно.
- записать вызов программы/скрипта запуска в /etc/rc.local в фоновом режиме (&) (в разных дистрибутивах может лежать в разных местах, например, /etc/rc.d/rc.local) с перенаправленными потоками ввода/вывода в /dev/null. Например, "/home/user/my_prog 1 > /dev/null 2 > /dev/null &". Также, дополнительно, можно воспользоваться командой nohup;
- внести вызов в /etc/inittab, согласно правилам его оформления. В отличие от первого способа тут можно указать уровень запуска для программы;
- написать скрипт, позволяющий запускать/останавливать/перезапускать программу как демона, а также получать информацию о её состоянии.
Второй метод довольно экзотичный, сам узнал о нём совсем недавно, хотя пишут, что им пользуются многие администраторы. Тем не менее, используя его, нельзя оперировать запущенными таким способом программами как демонами, что довольно неудобно. Да и загромождать inittab некрасиво.
Последний метод на текущий момент самый «кошерный», но немного сложнее предыдущих (возможно, на первый взгляд). Именно им представлены все системные демоны, что говорит само за себя. Потому его и рассмотрю ниже.
Также есть способ автозапуска графических программ, но его опишу в конце, отдельно от остальных, т.к. он имеет недемоническую сущность.
Сразу обмолвлюсь, что у меня стоит Debian 6 и в других дистрибутивах пути могут несколько различаться.
Автозапуск программы как демона
Обычно в системе уже есть много подсказок как это сделать, но всё-таки приходится лазить по разным файлам и искать в интеренете дополнительную информацию. Это не значит, что я опишу тут каждую букву, но искать придётся меньше, надеюсь.
Для начала стоит заглянуть в каталог /etc/init.d. Здесь содержатся запускные скрипты всех сервисов, а также два файла для желающих написать себе такой же:
README и skeleton
skeleton содержит в себе болванку скрипта запуска с довольно подробными комментариями, а README его неплохо дополняет, не смотря на его небольшой размер. Также можно посмотреть и другие файлы и попытаться найти там что-то, что прояснит непонятную ситуацию.
В 6-ом debian`е для запускных скриптов демонов используется LSB (Linux Script Base) Init Standart. Почитать о нём подробнее можно тут. Для систем, где LSB не используется стоит взглянуть сюда.
Может показаться, что это просто лишняя информация от автора, но это не так. То, что указано здесь используется при прописывании скрипта в систему. Тут как раз пригодится файл README, который показывает, что в заголовке skeleton перечислены не все возможные параметры. Как минимум есть ещё следующие:
Все параметры и их полное описание (на английском) можно увидеть тут, а на русском тут и тут (спасибо awzrno за новые ссылки ^_^). К русскому варианту добавлю, что в Required-Start: можно прописать $all, тогда текущий скрипт будет запускаться после всех остальных (иногда это бывает нужно). Также X-Interactive: true показывает, что этот скрипт может взаимодействовать с пользователем, запросом на ввод чего-нибудь, например пароля.
Далее в skeleton идёт инициализация переменных, используемых в самом скрипте. Часть из них нужно будет настроить под свои нужды. Потом проверки на то, что сам демон существует и попытка прочитать конфигурационный файл (их имена должны быть указаны в переменных выше), далее загрузка переменных rcS, а потом идёт одна из самых интересных частей init-файла:
. /lib/lsb/init-functions
это определение LSB функций работы с логами, LSB-статусом сервиса, работы с процессом. В некоторых дистрибутивах этот файл может находиться в каталоге /etc/init.d. Названия и часть подробностей можно узнать непосредственно из комментариев к функциям в этом файле, а также тут.
Следующая часть — непосредственно тело скрипта. Тело состоит из условных частей, которые являются командами для демона: start, stop, restart/reload/force-reload, status. Кто-то выделяет их в отдельные функции, кто-то нет. На мой взгляд, функциями они выглядят эстетичнее и код более понятен. Все эти команды объединяет оператор выбора case, который и выбирает для исполнения нужный кусок кода, в зависимости от команды (параметра) с которой был запущен init-скрипт.
Таким образом для создания обычного скрипта достаточно подставить в переменные в начале файла нужные значения и, возможно, немного добавить кода в функции start/stop (например загрузку/выгрузку драйвера).
После того как файл будет готов его нужно скопировать в /etc/init.d и добавить в автозагрузку:
update-rc.d <имя_скрипта> defaults
(или insserv <имя_скрипта> для debian 6 stable и выше)
Удалить из автозагрузки можно так:
update-rc.d -f <имя_скрипта> remove
(или insserv -r <имя_скрипта> для debian 6 stable и выше)
Далее также можно использовать команды sysv-rc-conf в debian или service в fedora core, чтобы включить/выключить автозагрузку сервиса.
Автозапуск графического ПО без ввода паролей
Сама по себе реализация такой возможности понижает уровень защищённости ОС, т.к. войти может любой. Но бывают ситуации, когда это необходимо. Рассмотрю тут варианты только для двух основных графических менеджеров, т.к. других установленных под рукой нет.
Убрать запрос пароля на вход можно в центре управления (kcontrol) -> системное администрирование -> менеджер входа в систему -> удобства. Там выбрать пользователя, под которым входить (кроме рута) и поставить нужные галочки (разрешить автовход и вход без ввода пароля).
Чтобы сделать автозапуск программы нужно в каталог /home/<пользователь>/.kde/Autostart добавить ссылку на запускной файл/скрипт нужного ПО.
Тут убрать запрос пароля на вход можно также в центре управления (gnome-control-center) -> Login Screen. Там, под рутом (ткнуть на замок, ввести пароль) выбрать пользователя, под которым входить (кроме суперпользователя).
Для автозапуска программы опять же в центре управления выбрать Startup Applications -> Add и заполнить маленькую форму.
Для обоих графических менеджеров:
Если нужно запустить под обычным пользователем, но от рута, то ещё надо настроить правила в /etc/sudoers на запуск конкретной программы/набора программ от имени суперпользователя (манами рекомендуется для безопасности делать это с помощью visudo). Как это делать рассказывать не буду, т.к. в man sudoers всё хорошо расписано.
Не секрет, что необходимость в автоматическом старте некоторых приложений возникает достаточно часто. Например, это нужно для различных IM клиентов.
В Ubuntu есть специальная программа для управления автозапуском. Найти её можно в меню Система→Параметры, называется она «Запускаемые приложения». Откройте её, появится список пользовательских приложений, запускаемых при старте системы. Он не содержит никаких системных программ и сервисов, только приложения, относящиеся к данному конкретному пользователю. Для добавления своей программы просто нажмите кнопку «Добавить»:
Поля «Название» и «Комментарий» открывшегося окна заполняйте как угодно, а в поле «Команда» запишите собственно команду для запуска вашего приложения:
Если вы её не знаете, то загляните в редактор главного меню, найдите там нужное вам приложение и нажмите кнопку «Свойства»:
Теперь просто скопируйте значение поля «Команда» из открывшегося окна в программу настройки автозапуска:
Вот и всё, опять всё просто и очевидно, не правда ли? Следующая тема также не отличается сложностью:
Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
Если бы кто-то мог показать и WHEN, и WHERE, это было бы здорово. Я говорю это, потому что знаю, что есть как минимум 2 способа запуска скрипта, который будет запускаться до запуска других приложений (например, X11) Это на самом деле довольно интересно. Сколько может быть разных способов?В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart . Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в «Система»> «Настройки»> «Запуск приложений».
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Для 14.04 и старше
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
Сохраните это в .conf файле /etc/init (если вам нужно, чтобы он запускался от имени root при загрузке системы), или в
/.config/upstart (если вам нужно, чтобы он работал от имени пользователя при входе в систему).
Учитывая, как работает SO и StackExchange, не могли бы вы привести пример сценария upstart и где он будет размещен? Это сделало бы это намного лучшим ответом. Ваша ссылка говорит, что это не поддерживается, и посмотрите на выскочку поваренной книги, которая является huuuge. У меня не так много идей, с чего начать. Что делать, если мне нужно запустить команду от имени пользователя root? @dopatraman В ответе говорится, что все процессы с этим запущены от имени пользователя root. Пожалуйста, обновите этот ответ, чтобы объяснить, что делать в системах с systemd, а не с upstart (Ubuntu 15.04+). Этот ответ не имеет смысла для меня. Приложения, перечисленные в, не system->pref->startup applications могут быть найдены /etc/init/ ни в, ни в/.config/upstart . Так, где определены приложения запуска?
Одним из подходов является добавление задачи @reboot cron :
-
Запуск crontab -e позволит вам редактировать свой хрон.
Добавляем к нему такую строку:
выполнит этот скрипт после загрузки вашего компьютера.
@reboot Ключевое слово хороший наконечник , потому что это не так широко известны. Приятно. Есть идеи , когда именно это срабатывает? Итак . это не запустится, если я потеряю питание и компьютер снова включится после восстановления питания? @siamii: man 5 crontab говорит, что @reboot выполняется при запуске (при запуске демона cron). Это круто. Пока что это выглядит лучше, чем rc.local когда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..Как насчет добавления команды в /etc/rc.local ? вам придется использовать доступ sudo, хотя для редактирования этого файла.
Это напрямую отвечает на вопрос: как просто выполнить некоторые сценарии при загрузке вашей системы. upstart выполняет более сложную задачу: запускает процессы демона. Таким образом, upstart запускает процессы-демоны, а /etc/rc.local запускает сценарии bash? Должно ли это? Это больше не работает в наши дни, верно?Чтобы выполнить (недолговечную) команду 1 при запуске с помощью systemd , вы можете использовать системный блок типа OneShot . Например, создать, /etc/systemd/system/foo.service содержащий:
Вы можете запустить несколько команд из одного и того же служебного файла, используя несколько ExecStart строк:
Команда всегда должна указываться с полным путем. Если какая-либо команда не выполняется, остальные не запускаются. Перед - тем, как путь указывает systemd игнорировать ненулевой статус выхода (вместо того, чтобы считать его неудачным).
Для пользовательских сессий вы можете
/.config/systemd вместо этого создать системный модуль . Это должно работать с 16.04 и выше, но не с более ранними выпусками Ubuntu с systemd (так как те все еще использовали Upstart для пользовательских сессий). Сеансами пользователя можно управлять с помощью тех же команд, что и с системными службами, но с --user добавленной опцией:
Синтаксис оболочки
Обратите внимание, что, в отличие от Upstart, systemd не запускает Exec* команды через оболочку. Он выполняет некоторое ограниченное расширение переменных и несколько команд (разделенных ; ), но это все, что касается оболочечного синтаксиса. Для чего-то более сложного, скажем, перенаправление или каналы, оберните вашу команду в sh -c '. ' или bash -c '. ' .
1 В отличие от долгоживущих демонов.
Можно ли установить приоритет на работу? или указать, что это зависит от другого сервиса, который будет запущен первым? @ r3wt да, есть разные способы сделать это. WantedBy Здесь используется, например, позволяет начать , когда multi-user.target достигается. Вы можете использовать Before , After , Requires и т.д. См man systemd.unit Пожалуйста. - Между прочим, это RemainAfterExit зависит от того, какую службу вы запускаете и от какого поведения. Например, /bin/df -h <s> бы </ s> должен был иметь RemainAfterExit=no . @PerlDuck Ничто не присуще df этим потребностям RemainAfterExit=no . Если вы не хотите многократно выполнять команду при каждом запуске systemctl start foo .Существуют разные способы автоматического запуска команд:
Система upstart выполнит все сценарии, из которых она найдет конфигурацию в каталоге /etc/init . Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на выключение), и поэтому являются местом для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма.
Сценарий оболочки, указанный .gnomerc в вашем домашнем каталоге, автоматически создается при каждом входе в сеанс GNOME. Вы можете поместить произвольные команды там; Переменные окружения, которые вы установили в этом скрипте, будут видны любой программе, запущенной в вашем сеансе.
Обратите внимание, что сессия не начинается, пока .gnomerc скрипт не завершится; следовательно, если вы хотите автоматически запустить какую-то долго работающую программу, вам нужно добавить & ее в вызов программы, чтобы отсоединить ее от работающей оболочки.
Пункт меню « Система» -> «Настройки» -> «Запуск приложений» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему вкусу. Это имеет почти то же самое назначение и область действия .gnomerc сценария, за исключением того, что вам не нужно знать sh синтаксис (но вы также не можете использовать какую-либо sh программную конструкцию).
Читайте также: