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

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

Один из подходов заключается в добавлении @reboot хрон задача:

  1. Бегущий crontab -e позволит вам редактировать свой cron.
  2. Добавление к нему такой строки, как эта:

    @reboot /path/to/script

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

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

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

Для 14.04 и старше

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

start on startuptaskexec /path/to/command

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

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

sudo nano /etc/rc.local

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

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

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

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

sudo chmod a+x /etc/rc.local

Для 15.04 и более поздних версий:

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

[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target

Тогда беги:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

По сути, это просто преобразование типичная работа выскочки к системному (см. Systemd для начинающих пользователей).

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

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

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

Подходящий:


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

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

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

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


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

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

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

    Вы можете найти читаемое введение в at: http://upstart.ubuntu.com/getting-started.html справочные страницы 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=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script

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

Примерный пример myscript.sh:

#!/bin/bash<commands to be executed>exit

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

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

В качестве альтернативы вы можете добавить его в /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 cronJan 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-02Jan 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 rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 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.dtotal 44drwxr-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/shPATH=/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-vmlinuzSHELL=/bin/shPATH=/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 в командную строку ядра в /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) в конце, чтобы избежать паники ядра.

Если бы кто-нибудь мог также показать, КОГДА и ГДЕ это было бы потрясающе. Я говорю это, потому что знаю, что есть по крайней мере 2 способа запустить скрипт, который запустится до запуска других приложений (например, X11).

+1 к @GabrielFair. БОЛЬШАЯ часть проблемы заключается в том, что первоначальному вопросу и ответу ДЕСЯТЬ ЛЕТ. Я бы также добавил, что существует слишком много способов решить эту проблему. Что случилось с простотой философии Unix?! Попросите кого-нибудь * знающего * и с достаточным количеством баллов переписать этот пост или добавить новый, актуальный, окончательный ответ для современных версий ОС.

Вся эта ветка ответов - сплошная неразбериха. Формат обмена стеком, похоже, не лучше всего подходит для этого вопроса