- Вопрос или проблема
- Для 14.04 и старше
- Для 15.04 и новее:
- Синтаксис оболочки
- cron ответ реализован иначе, чем ответ с наибольшим числом голосов
- Когда запускается cron?
- Где разместить свои скрипты
- Как выглядит скрипт?
- Ответ или решение
- 1. Использование cron с параметром @reboot
- 2. Системные службы с systemd
- 3. Запуск через rc.local
- 4. Использование Startup Applications для графических скриптов
- 5. Файлы .desktop
- Заключение
Вопрос или проблема
Как я могу автоматически запускать скрипты при загрузке Ubuntu, чтобы не запускать их вручную после загрузки?
Один из подходов – добавить задачу cron с пометкой @reboot:
- Запустив
crontab -e
, вы сможете редактировать свои задания cron. -
Добавив в файл строку наподобие этой:
@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В отличие от долгоживущих демонов.
Существует несколько способов автоматического выполнения команд:
-
Система upstart будет выполнять все скрипты, для которых она находит конфигурацию в директории
/etc/init
. Эти скрипты будут выполняться при загрузке системы (или в ответ на определённые события, например, запрос на отключение) и поэтому являются местом для выполнения команд, которые не взаимодействуют с пользователем; все серверы запускаются с помощью этого механизма.Вы можете найти доступное введение на: http://upstart.ubuntu.com/getting-started.html страницы man
man 5 init
иman 8 init
предоставляют все детали. -
Оболочка скрипт с именем
.gnomerc
в вашем домашнем каталоге автоматически загружается каждый раз, когда вы входите в сессию GNOME. Вы можете поместить произвольные команды в этот файл; переменные окружения, которые вы задаете в этом скрипте, будут видны любому запущенному вами в сессии программному обеспечению.Обратите внимание, что сессия не начинается, пока скрипт
.gnomerc
не завершится; поэтому, если вы хотите автоматически запустить какую-либо длительно работающую программу, вам нужно добавить&
к вызову программы, чтобы отделить ее от работающей оболочки. -
Опция меню Система -> Параметры -> Автозагрузка приложений позволяет вам определить, какие приложения должны быть запущены, когда начинается ваша графическая сессия (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
позволяет запускать скрипт один раз в момент загрузки.
Шаги:
-
Откройте терминал и отредактируйте файлы
cron
для текущего пользователя:crontab -e
-
Добавьте строку следующего вида в открывшийся файл:
@reboot /path/to/your/script.sh
-
Сохраните изменения и закройте редактор.
2. Системные службы с systemd
Для более сложных задач и сервисов рекомендуется использовать systemd
, который пришел на смену upstart
в версиях Ubuntu начиная с 15.04. С его помощью можно создать юнит типа oneshot
, предназначенный для выполнения однократной команды при загрузке.
Шаги:
-
Создайте файл службы:
sudo nano /etc/systemd/system/my-service.service
-
Заполните файл следующими данными:
[Unit] Description=Запускаемый скрипт при загрузке [Service] ExecStart=/path/to/your/script.sh Type=oneshot RemainAfterExit=yes [Install] WantedBy=multi-user.target
-
Перезагрузите конфигурацию
systemd
и активируйте сервис:sudo systemctl daemon-reload sudo systemctl enable my-service.service
3. Запуск через rc.local
Ранее в Ubuntu использовался файл /etc/rc.local
для выполнения команд при загрузке. Если в вашей версии Ubuntu этот файл отсутствует (например, начиная с 16.04), вам нужно будет создать его.
Шаги:
-
Откройте или создайте файл:
sudo nano /etc/rc.local
-
Добавьте в него следующую строку перед
exit 0
:/path/to/your/script.sh
-
Убедитесь, что файл исполняемый:
sudo chmod +x /etc/rc.local
4. Использование Startup Applications
для графических скриптов
Если ваш скрипт должен запускаться при входе в графическую сессию, вы можете воспользоваться встроенной утилитой "Startup Applications".
Шаги:
- Откройте меню и найдите "Startup Applications".
- Нажмите "Add", укажите имя, описание (по желанию) и путь к вашему скрипту.
- Сохраните изменения.
5. Файлы .desktop
Для более сложных сценариев запуска можно использовать .desktop
файлы.
Пример настройки файла:
-
Создайте
.desktop
файл в~/.config/autostart/
:nano ~/.config/autostart/my-script.desktop
-
Содержимое файла:
[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.