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

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

659
задан 23 November 2016 в 22:22

9 ответов

В зависимости от того, какие скрипты вам нужно запустить... Для сервисов и тому подобного вы должны использовать upstart. Но для пользовательского скрипта они должны быть запущены как сеансовые скрипты gnome! Посмотрите в разделе System > Preferences > Startup Applications.

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

For 14. 04 и старше

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

start on startup
task
exec /path/to/command

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

225
ответ дан 23 November 2016 в 22:22

Один из подходов - добавить задачу @reboot cron:

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

    @reboot /path/to/script
    

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

638
ответ дан 23 November 2016 в 22:22

Вы можете добавить команды в /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), вам нужно добавить строку shebang сверху (например, #!/bin/bash) и убедиться, что файл исполняемый:

sudo chmod a+x /etc/rc.local
190
ответ дан 23 November 2016 в 22:22

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

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

    Вы можете найти введение, которое можно прочитать по адресу:

    1. /etc/init: http://upstart.ubuntu.com/getting-started.html man pages man 5 init и man 8 init дают вам полную информацию.

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

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

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

72
ответ дан 23 November 2016 в 22:22

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

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

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

19
ответ дан 23 November 2016 в 22:22

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

Чтобы запустить (кратковременную) команду 1 при запуске с помощью systemd , вы можете использовать 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

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

Релевантно:


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

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

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

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


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

115
ответ дан 23 November 2016 в 22:22

$ 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

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

Пример примера myscript.sh :

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

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

33
ответ дан 23 November 2016 в 22:22

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

5
ответ дан 23 November 2016 в 22:22

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`
9
ответ дан 23 November 2016 в 22:22

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

Похожие вопросы: