Как запустить скрипты при запуске?
Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
10 ответов
В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart. Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в "Система"> "Настройки"> "Запуск приложений".
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Для 14.04 и старше
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
start on startup
task
exec /path/to/command
Сохраните это в .conf
файл в /etc/init
(если вам нужно запустить его как root при загрузке системы), или в ~/.config/upstart
(если вам нужно, чтобы он работал как ваш пользователь при входе в систему).
Одним из подходов является добавление задачи @reboot cron:
- Бег
crontab -e
позволит вам редактировать свой хрон. Добавляем к нему такую строку:
@reboot /path/to/script
выполнит этот скрипт после загрузки вашего компьютера.
Как насчет добавления команды в /etc/rc.local
? вам придется использовать доступ sudo, хотя для редактирования этого файла.
sudo nano /etc/rc.local
Для 15.04 и позже:
Чтобы выполнить (недолговечную) 1 команду при запуске с использованием systemd, вы можете использовать системный модуль типа OneShot
, Например, создать /etc/systemd/system/foo.service
содержащий:
[Unit]
Description=Job that runs your user script
[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 игнорировать ненулевой статус выхода (вместо того, чтобы считать его неудачным).
Соответствующий:
- Arch Wiki запись на systemd
man 5 systemd.service
Для пользовательских сессий вы можете создать системный модуль в ~/.config/systemd
вместо. Это должно работать с 16.04 и выше, но не с более ранними выпусками Ubuntu с systemd (так как те все еще использовали Upstart для пользовательских сессий). Сеансами пользователя можно управлять с помощью тех же команд, что и с системными службами, но с --user
добавлена опция:
systemctl --user daemon-reload
systemctl --user status foo.service
Синтаксис оболочки
Обратите внимание, что в отличие от Upstart, systemd не запускает Exec*
Команды через оболочку. Он выполняет ограниченное расширение переменной и несколько команд (разделенных ;
), но это все, что касается shell-подобного синтаксиса. Для чего-то более сложного, скажем, перенаправление или каналы, оберните вашу команду в 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
Здесь можно поместить файл, который будет выполнен при запуске.
Пример для примера .desktop
файл:
Выкладываю следующее .desktop
файл в $HOME/.config/autostart
и дано chmod +x
:
[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
(обычно рекомендуется /usr/local/bin
так-что может быть выполнено непосредственно командой say myscript
заменено на "</path/to/script>"
).
Пример примера script.sh
:
#!/bin/bash
<commands to be executed>
exit
Результат:.desktop
файл будет запущен с $HOME/.config/autostart
которые выполняют скрипт Exec=
Следовательно, вы можете запустить желаемый сценарий оболочки при запуске!
Для простых вещей вы можете добавить команду System->Preferences->Sessions, указывающую местоположение вашего скрипта.
В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или сделать выскочку, если это материал более низкого уровня.
Посмотрите 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 (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (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): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user 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 используется для процессов Ubuntu, которые запускаются автоматически. Это улучшенное решение, подобное старым сценариям System-V init.d. Это также позволяет вам поставить предварительные условия для запуска вашего скрипта (т.е. вам нужна работающая сеть? И т. Д.)
Если вы хотите, чтобы ваш скрипт запускался перед systemd сразу после запуска ядра, AFAIK способ добавить
init=/path/to/script
в командную строку ядра в или в будущем, сделайте свой собственный пункт меню в
/etc/grub.d/40_custom
скопировав пункт меню и внеся необходимые изменения (и запустив
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) в конце, чтобы избежать паники ядра.