Как запустить скрипты при старте?

Вопрос или проблема

Как я могу автоматически запускать скрипты при загрузке Ubuntu, чтобы не запускать их вручную после загрузки?

Один из подходов – добавить задачу cron с пометкой @reboot:

  1. Запустив crontab -e, вы сможете редактировать свои задания cron.
  2. Добавив в файл строку наподобие этой:

    @reboot /path/to/script
    

    вы запустите данный скрипт, как только ваш компьютер загрузится.

В зависимости от того, какие именно скрипты вам нужно запускать… Для сервисов и подобных задач следует использовать upstart. Но для пользовательских скриптов их следует запускать как скрипты сессии через gnome! Ознакомьтесь с настройками в Система > Параметры > Автозагрузка приложений.

Кстати, если вам нужно, чтобы некоторые скрипты выполнялись при входе в терминал, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.

Для 14.04 и старше

Простая команда (которая не требует постоянного выполнения) может использовать задачу Upstart, например:

start on startup
task
exec /path/to/command

Сохраните это в файле .conf в /etc/init (если необходимо, чтобы она выполнялась от имени root при загрузке системы), или в ~/.config/upstart (если нужно, чтобы она выполнялась от вашего имени при входе в систему).

Вы можете добавить команды в /etc/rc.local:

sudo nano /etc/rc.local

Это выполняет команды от имени root.

Чтобы выполнять команды от имени конкретного пользователя, используйте sudo -i -u (-i, чтобы также запускать оболочку входа). Например, чтобы установить постоянный SSH туннель, где myhost определяется в файле johndoe ~/.ssh/config:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Обратите внимание, что если /etc/rc.local не существует (как это происходит в Ubuntu с 16.04), вам нужно добавить shebang на первой строке (например, #!/bin/bash) и убедиться, что файл исполняем:

sudo chmod a+x /etc/rc.local

Для 15.04 и новее:

Чтобы запустить (краткосрочную)1 команду при загрузке с использованием systemd, вы можете использовать юнит systemd типа OneShot. Например, создайте /etc/systemd/system/foo.service, содержащий:

[Unit]
Description=Задача, которая запускает ваш пользовательский скрипт

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Затем выполните:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

По сути, это просто преобразование типичного задания Upstart в задание systemd (см. Systemd для пользователей Upstart).

Вы можете запускать несколько команд из одного файла службы, используя несколько строк ExecStart:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Команда всегда должна указываться с полным путём. Если какая-либо команда завершается с ошибкой, остальные не запускаются. Знак - перед путём говорит systemd игнорировать ненулевой код завершения (вместо того чтобы считать это ошибкой).

Соответствующие ресурсы:


Для пользовательских сессий вы можете создать юнит systemd в ~/.config/systemd/user вместо этого. Это должно работать с 16.04 и новее, но не ранние версии Ubuntu с systemd (так как они все еще использовали Upstart для пользовательских сессий). Юниты пользовательских сессий могут управляться теми же командами, что и системные службы, но с добавлением опции --user:

systemctl --user daemon-reload
systemctl --user status foo.service

Синтаксис оболочки

Обратите внимание, что, в отличие от Upstart, systemd не выполняет команды Exec* через оболочку. Он выполняет некоторую ограниченную расширяемость переменных и несколько команд (разделенных ;) сам, но это почти всё, что касается синтаксиса, похожего на оболочку. Для всего более сложного, например, перенаправления или пайпов, оберните вашу команду в sh -c '...' или bash -c '...'.


1В отличие от долгоживущих демонов.

Существует несколько способов автоматического выполнения команд:

  1. Система upstart будет выполнять все скрипты, для которых она находит конфигурацию в директории /etc/init. Эти скрипты будут выполняться при загрузке системы (или в ответ на определённые события, например, запрос на отключение) и поэтому являются местом для выполнения команд, которые не взаимодействуют с пользователем; все серверы запускаются с помощью этого механизма.

    Вы можете найти доступное введение на: http://upstart.ubuntu.com/getting-started.html страницы man man 5 init и man 8 init предоставляют все детали.

  2. Оболочка скрипт с именем .gnomerc в вашем домашнем каталоге автоматически загружается каждый раз, когда вы входите в сессию GNOME. Вы можете поместить произвольные команды в этот файл; переменные окружения, которые вы задаете в этом скрипте, будут видны любому запущенному вами в сессии программному обеспечению.

    Обратите внимание, что сессия не начинается, пока скрипт .gnomerc не завершится; поэтому, если вы хотите автоматически запустить какую-либо длительно работающую программу, вам нужно добавить & к вызову программы, чтобы отделить ее от работающей оболочки.

  3. Опция меню Система -> Параметры -> Автозагрузка приложений позволяет вам определить, какие приложения должны быть запущены, когда начинается ваша графическая сессия (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему усмотрению. Это имеет почти ту же цель и масштаб, что и скрипт .gnomerc, только вам не нужно знать синтаксис sh (но вы также не можете использовать никакие конструкты программирования sh).

$HOME/.config/autostart содержит список автозагружаемых приложений. Файлы .desktop в этой папке будут выполняться при загрузке. Им может потребоваться исполняемое разрешение (chmod +x startup.desktop).

Пример файла .desktop:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Здесь "</path/to/script>" заменяется на путь к вашему script.sh. Если вы поместите свой скрипт myscript в /usr/local/bin, чтобы его можно было выполнять напрямую командой, вы можете написать myscript вместо "</path/to/script>".

Пример скрипта myscript.sh:

#!/bin/bash
<команды для выполнения>
exit

Результат:
.desktop файл будет запущен из $HOME/.config/autostart, который выполняет скрипт через Exec=

Для простых задач вы можете добавить команду в Система->Параметры->Сессии, указывая на местоположение вашего скрипта.

В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или создать задачу upstart, если это более низкоуровенное действие.

Смотрите https://help.ubuntu.com/community/UbuntuBootupHowto для получения дополнительной информации

cron ответ реализован иначе, чем ответ с наибольшим числом голосов

Этот ответ все еще использует cron, но использует другой метод, чем наиболее голосующий ответ. Это работает с Ubuntu 16.04, но, вероятно, поддерживается и гораздо раньше. Просто я начал использовать cron для выполнения заданий при загрузке компьютера с 16.04.

Когда запускается cron?

В комментариях кто-то спросил “когда они запускаются?”. Это можно увидеть в syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Запуск @reboot задач)
Jan 02 16:54:40 alien systemd[1]: Запущен Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 запущен 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Нормальное завершение (0 заданий выполнено)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): сессия закрыта для пользователя root
Jan 02 16:54:40 alien cron[919]: sendmail: Не удается открыть smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): сессия закрыта для пользователя root
Jan 02 16:54:40 alien cron[919]: sendmail: Не удается открыть smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): сессия закрыта для пользователя root

Одно, что стоит отметить, это то, что cron может отправлять вам по электронной почте статус выполненных задач и задачи @reboot, так что ранний сетевой менеджер и почта не будут работать, если вы не добавите команду sleep в свой скрипт(ы).

Где разместить свои скрипты

Поместите свои скрипты в директорию /etc/cron.d:

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

Как выглядит скрипт?

Вот несколько скриптов, которые я настроил для запуска при каждой загрузке:

$ cat /etc/cron.d/cycle-grub-background 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`

Вы должны использовать upstart для этого. Upstart используется для процессов Ubuntu, которые автоматически запускаются. Это улучшенное решение, подобное старым скриптам System-V init.d. Оно также позволяет вам задать предусловия для запуска вашего скрипта (т.е. нужно ли, чтобы сеть работала? и т.д.)

Если вы хотите, чтобы ваш скрипт выполнялся перед systemd сразу после старта ядра, насколько я знаю, способ заключается в добавлении init=/path/to/script в командную строку ядра в /boot/grub/grub.cfg или, чтобы это было более гибким, создайте свою собственную запись меню в /etc/grub.d/40_custom, скопировав запись меню из /boot/grub/grub.cfg и внесите необходимые изменения (и выполните update-grub после этого, чтобы grub добавил ваш пользовательский файл в /boot/grub/grub.cfg).

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 

замените на

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script

Следите за тем, чтобы правильно указать, например, #!/bin/bash на первой строке и exec /sbin/init (если /sbin/init существует в вашей системе – в моей системе это указывает на systemd) в конце, чтобы избежать паники ядра.

Что-то из текущего десятилетия:
Откройте меню => найдите “Автозагрузка приложений” => откройте и нажмите “добавить”.
Я не буду объяснять, для чего предназначены поля “имя” и “комментарий”, но “команда” – это либо путь к вашему скрипту, либо так называемая “однострочная команда”.

Документация Ubuntu по “Автозагрузке приложений”: https://help.ubuntu.com/stable/ubuntu-help/startup-applications.html.en

Ответ или решение

Чтобы автоматически запускать скрипты при старте Ubuntu и не заниматься их ручным запуском, есть несколько подходов. В зависимости от ваших потребностей и версии операционной системы, вы можете выбрать наиболее подходящий метод.

1. Использование cron с параметром @reboot

Один из простейших способов — это добавить задачу в cron, которая будет выполняться при каждом запуске системы. Задание с параметром @reboot позволяет запускать скрипт один раз в момент загрузки.

Шаги:

  1. Откройте терминал и отредактируйте файлы cron для текущего пользователя:

    crontab -e
  2. Добавьте строку следующего вида в открывшийся файл:

    @reboot /path/to/your/script.sh
  3. Сохраните изменения и закройте редактор.

2. Системные службы с systemd

Для более сложных задач и сервисов рекомендуется использовать systemd, который пришел на смену upstart в версиях Ubuntu начиная с 15.04. С его помощью можно создать юнит типа oneshot, предназначенный для выполнения однократной команды при загрузке.

Шаги:

  1. Создайте файл службы:

    sudo nano /etc/systemd/system/my-service.service
  2. Заполните файл следующими данными:

    [Unit]
    Description=Запускаемый скрипт при загрузке
    
    [Service]
    ExecStart=/path/to/your/script.sh
    Type=oneshot
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
  3. Перезагрузите конфигурацию systemd и активируйте сервис:

    sudo systemctl daemon-reload
    sudo systemctl enable my-service.service

3. Запуск через rc.local

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

Шаги:

  1. Откройте или создайте файл:

    sudo nano /etc/rc.local
  2. Добавьте в него следующую строку перед exit 0:

    /path/to/your/script.sh
  3. Убедитесь, что файл исполняемый:

    sudo chmod +x /etc/rc.local

4. Использование Startup Applications для графических скриптов

Если ваш скрипт должен запускаться при входе в графическую сессию, вы можете воспользоваться встроенной утилитой "Startup Applications".

Шаги:

  1. Откройте меню и найдите "Startup Applications".
  2. Нажмите "Add", укажите имя, описание (по желанию) и путь к вашему скрипту.
  3. Сохраните изменения.

5. Файлы .desktop

Для более сложных сценариев запуска можно использовать .desktop файлы.

Пример настройки файла:

  1. Создайте .desktop файл в ~/.config/autostart/:

    nano ~/.config/autostart/my-script.desktop
  2. Содержимое файла:

    [Desktop Entry]
    Type=Application
    Exec=/path/to/your/script.sh
    Hidden=false
    NoDisplay=false
    X-GNOME-Autostart-enabled=true
    Name=My Startup Script

Заключение

Каждый из перечисленных подходов имеет свои особенности и подходит для определенных задач. Выбор метода зависит от ваших конкретных нужд: хотите ли вы запускать скрипты при загрузке системы, или только при входе в пользовательский интерфейс. Efficient use of these techniques can greatly streamline your workflow in Ubuntu and increase productivity.

Оцените материал
Добавить комментарий

Капча загружается...