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

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

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

8 ответов

Один из подходов состоит в том, чтобы добавить задачу @reboot cron:

Запуск crontab -e позволит вам редактировать ваш cron. Добавьте к нему такую ​​строку:
@reboot /path/to/script
выполнит этот сценарий после загрузки вашего компьютера.
451
ответ дан 29 May 2018 в 13:00
  • 1
    Ключевое слово @reboot - хороший отзыв, потому что он не широко известен. – jathanism 11 August 2010 в 18:39
  • 2
    Ницца. Любая идея точно, когда это срабатывает? – Oli♦ 2 February 2011 в 17:54
  • 3
    Итак ... это не сработает, если я потеряю питание, и компьютер снова вернется, когда будет восстановлена ​​мощность? – Mike Wills 22 June 2012 в 00:27
  • 4
    @siamii: man 5 crontab говорит, что @reboot выполняется при запуске (когда запущен cron-демон). – jfs 29 March 2013 в 22:04
  • 5
    Это круто. Пока это кажется лучше, чем rc.local, поскольку система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно вызвать что-то после запуска системы . – Karthik T 10 October 2013 в 12:17

Как добавить команду в /etc/rc.local? вам нужно будет использовать sudo-доступ, но для редактирования этого файла.

sudo nano /etc/rc.local
121
ответ дан 29 May 2018 в 13:00
  • 1
    Это наиболее непосредственно отвечает на вопрос: как просто выполнять некоторые скрипты, когда ваша система загружается. upstart выполняет более сложную задачу: запускает процессы демона. – Dogweather 8 August 2013 в 00:01
  • 2
    Итак, upstart запускает процессы демона, в то время как /etc/rc.local запускает скрипты bash? – Donato 10 May 2015 в 21:51
  • 3
    Это должен быть принятый ответ ... – Android Dev 23 November 2016 в 23:23
  • 4
    Должно ли это? Это уже не работает в наши дни, верно? – DaVince 28 April 2017 в 11:29
  • 5
    Не работает с Ubuntu 17.04 systemd – qodeninja 1 August 2017 в 06:58

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

Система выскочки выполнит все сценарии, из которых она находит конфигурацию в каталоге /etc/init. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на завершение), а также место для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма. Вы можете найти читаемое введение на странице http://upstart.ubuntu.com/getting-started.html man-страницы man 5 init и man 8 init, чтобы получить полную информацию. Сценарий оболочки с именем .gnomerc в вашем домашнем каталоге автоматически создается при каждом входе в сеанс GNOME. Вы можете помещать в него произвольные команды; переменные среды, установленные в этом скрипте, будут видны любой программой, которую вы запускаете в своем сеансе. Обратите внимание, что сеанс не запускается до завершения скрипта .gnomerc; поэтому, если вы хотите автозапускать какую-то давно действующую программу, вам нужно добавить & к вызову программы, чтобы отделить ее от рабочей оболочки. Параметр меню «Система» -> «Настройки» -> «Приложения для запуска» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет некоторые из них) и добавлять или удалять их на свой вкус. Это имеет почти ту же цель и объем сценария .gnomerc, за исключением того, что вам не нужно знать синтаксис sh (но вы также не можете использовать любую конструкцию программирования sh).
68
ответ дан 29 May 2018 в 13:00
  • 1
    3) «Это имеет почти ту же цель и масштаб сценария .gnomerc», за исключением .gnomerc, по-видимому, выполняется перед загрузкой Unity, а Startup Applications, по-видимому, работает до [ ! d1] loading Unity. Мне пришлось запустить программу, которая находится на панели меню Unity, и в этом случае это имело огромное значение! – Dollynho 23 January 2013 в 22:13
  • 2
    @ ruda.almeida Спасибо, что указали это. Ответ был написан в дни доединства. – Riccardo Murri 23 January 2013 в 22:48
  • 3
    sudo update-rc.d myscript.sh defaults, где /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске. – Dan Dascalescu 9 August 2016 в 09:16

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

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

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

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

Команда всегда должна указываться с полным путем. Если какая-либо команда выходит из строя, остальные не запускаются. [[8]]

Релевантно:

Запись в Arch Wiki на systemd man 5 systemd.service Релевантно:

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

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

1 As против долгоживущих демонов.

44
ответ дан 29 May 2018 в 13:00
  • 1
    можно ли задать приоритет на задание? или указать, что это зависит от другой службы, которая должна быть запущена в первую очередь? – r3wt 25 April 2017 в 03:38
  • 2
    @ r3wt да, есть разные способы сделать это. Используемый здесь WantedBy, например, запускает его при достижении multi-user.target. Вы можете использовать Before, After, Requires и т. Д. См. man systemd.unit – muru 3 January 2018 в 10:07
  • 3
    @PerlDuck не единственное, чего не хватало. Благодаря! – muru 5 March 2018 в 17:53
  • 4
    Пожалуйста. - Btw, RemainAfterExit зависит от запуска службы и ее желаемого поведения. Например, /bin/df -h & lt; s & gt; будет & lt; / s & gt; должен иметь RemainAfterExit=no. – PerlDuck 5 March 2018 в 18:19
  • 5
    @PerlDuck В df нет ничего, что нужно RemainAfterExit=no. Если вы не хотите повторно выполнять команду каждый раз при запуске systemctl start foo. – muru 5 March 2018 в 18:32
$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

Здесь [ f9] заменяется на путь к вашему script.sh (обычно рекомендуется для /usr/local/bin так: это может быть выполнено непосредственно командой say myscript заменено на "</path/to/script>").

Пример примера script.sh ]:

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

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

Следовательно, вы можете запустите нужный сценарий оболочки при запуске!

22
ответ дан 29 May 2018 в 13:00

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

В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или выполнить выскочку, если это больше System-> Preferences-> Sessions .

Взгляните на upstart для получения дополнительной информации [!d5 ]

18
ответ дан 29 May 2018 в 13:00

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

5
ответ дан 29 May 2018 в 13:00

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`
3
ответ дан 29 May 2018 в 13:00
  • 1
    Существует много разных способов добавления cronjobs, но ядро ​​ответа с высоким разрешением и ваш ответ по-прежнему остаются @reboot. – muru 3 January 2018 в 09:40
  • 2
    Альтернативные методы добавления crontabs должны быть отправлены на askubuntu.com/q/2368/158442 , что явно связано с добавлением заданий Cron. – muru 3 January 2018 в 09:47
  • 3
    Позволю себе не согласиться. В основе рассматриваемого ответа используется crontab -e, который некоторые считают одним из черных искусств из-за виртуального интерфейса. С другой стороны, этот ответ может понравиться тем, чьи мозги связаны определенным образом. Мы не все отлиты из той же формы. И снова этот ответ уже имеет один голос, поэтому мы позволим демократии пройти курс. – WinEunuuchs2Unix 3 January 2018 в 09:58
  • 4
    О, пожалуйста. Мы с вами знаем, что редактор можно изменить. – muru 3 January 2018 в 09:59
  • 5
    @muru Да, возможно, потому, что вы научили меня, и я научился менять редактор на что-то вроде nano или на пару других CLI. Но я в лагере гедитов. Кроме того, crontab -e вызывает воспоминания о звездочке («*») в течение минут, часов и т. Д., Которые я всегда обнаружил, для чего мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.d и /etc/cron.daily моего выбора. Тем более, что он отражает методы /etc/udev/rules.d и /etc/systemd/system-sleep. Просто кажется, что это хорошо. – WinEunuuchs2Unix 3 January 2018 в 10:09

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

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