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

Как я могу запускать скрипты автоматически при запуске 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:

  1. Бег crontab -e позволит вам редактировать свой хрон.
  2. Добавляем к нему такую ​​строку:

    @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 игнорировать ненулевой статус выхода (вместо того, чтобы считать его неудачным).

Соответствующий:


Для пользовательских сессий вы можете создать системный модуль в ~/.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 В отличие от долгоживущих демонов.

Существуют разные способы автоматического запуска команд:

  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 Здесь можно поместить файл, который будет выполнен при запуске.

Пример для примера .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) в конце, чтобы избежать паники ядра.

Другие вопросы по тегам