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


520

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


3
Если бы кто-то мог показать и WHEN, и WHERE, это было бы здорово. Я говорю это, потому что знаю, что есть как минимум 2 способа запуска скрипта, который будет запускаться до запуска других приложений (например, X11)
Buttink

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

1
Это на самом деле довольно интересно. Сколько может быть разных способов?
devios1

Ответы:


206

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

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

Для 14.04 и старше

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

start on startup
task
exec /path/to/command

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


58
Учитывая, как работает SO и StackExchange, не могли бы вы привести пример сценария upstart и где он будет размещен? Это сделало бы это намного лучшим ответом. Ваша ссылка говорит, что это не поддерживается, и посмотрите на выскочку поваренной книги, которая является huuuge. У меня не так много идей, с чего начать.
Этеш Чоудхури

2
Что делать, если мне нужно запустить команду от имени пользователя root?
Допатрам

1
@dopatraman В ответе говорится, что все процессы с этим запущены от имени пользователя root.
AStopher

4
Пожалуйста, обновите этот ответ, чтобы объяснить, что делать в системах с systemd, а не с upstart (Ubuntu 15.04+).

3
Этот ответ не имеет смысла для меня. Приложения, перечисленные в, не system->pref->startup applicationsмогут быть найдены /etc/init/ни в, ни в ~/.config/upstart. Так, где определены приложения запуска?
phil294

554

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

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

    @reboot /path/to/script
    

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


85
@rebootКлючевое слово хороший наконечник , потому что это не так широко известны.
jathanism

12
Приятно. Есть идеи , когда именно это срабатывает?
Оли

2
Итак ... это не запустится, если я потеряю питание и компьютер снова включится после восстановления питания?
Майк Уиллс

18
@siamii: man 5 crontabговорит, что @rebootвыполняется при запуске (при запуске демона cron).
Jfs

9
Это круто. Пока что это выглядит лучше, чем rc.localкогда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..
Karthik T

161

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

sudo nano /etc/rc.local

19
Это напрямую отвечает на вопрос: как просто выполнить некоторые сценарии при загрузке вашей системы. upstart выполняет более сложную задачу: запускает процессы демона.
Dogweather

1
Таким образом, upstart запускает процессы-демоны, а /etc/rc.local запускает сценарии bash?
Донато

5
Должно ли это? Это больше не работает в наши дни, верно?
DaVince

4
Работайте с Ubuntu 17.04 systemd
qodeninja

3
Обратите внимание, что если вы создадите этот файл самостоятельно (как я сделал), вам придется изменить файл на исполняемый с chmod 755 rc.localи добавить #!/bin/bashв первую строку.
Псита

77

Для 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*команды через оболочку. Он выполняет некоторое ограниченное расширение переменных и несколько команд (разделенных ;), но это все, что касается оболочечного синтаксиса. Для чего-то более сложного, скажем, перенаправление или каналы, оберните вашу команду в sh -c '...'или bash -c '...'.


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


Можно ли установить приоритет на работу? или указать, что это зависит от другого сервиса, который будет запущен первым?
r3wt

1
@ r3wt да, есть разные способы сделать это. WantedByЗдесь используется, например, позволяет начать , когда multi-user.targetдостигается. Вы можете использовать Before, After, Requiresи т.д. Смman systemd.unit
Muru

@PerlDuck не единственное, чего не хватало. Спасибо!
Муру

Пожалуйста. - Между прочим, это RemainAfterExitзависит от того, какую службу вы запускаете и от какого поведения. Например, /bin/df -h<s> бы </ s> должен был иметь RemainAfterExit=no.
PerlDuck

@PerlDuck Ничто не присуще dfэтим потребностям RemainAfterExit=no. Если вы не хотите многократно выполнять команду при каждом запуске systemctl start foo.
Муру

71

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

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

    Вы можете найти читаемое введение по адресу: http://upstart.ubuntu.com/getting-started.html справочные страницы man 5 initи man 8 initдать вам полную информацию.

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

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

  3. Пункт меню « Система» -> «Настройки» -> «Запуск приложений» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему вкусу. Это имеет почти то же самое назначение и область действия .gnomercсценария, за исключением того, что вам не нужно знать shсинтаксис (но вы также не можете использовать какую-либо shпрограммную конструкцию).


11
3) «Это имеет почти то же самое назначение и область действия сценария .gnomerc», за исключением того, что, .gnomercочевидно, запускается до загрузки Unity и, Startup Applicationsочевидно, запускается после загрузки Unity. Мне пришлось запустить программу, которая находится в строке меню Unity, и это имело огромное значение в этом случае!
Этот бразильский парень

1
@ ruda.almeida Спасибо за указание на это. Ответ был написан в дни до единства.
Риккардо Мурри

1
sudo update-rc.d myscript.sh defaultsгде /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске.
Дан Даскалеску

27
$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так, что может быть выполнен непосредственно командой скажем, myscriptзаменен на "</path/to/script>").

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

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

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

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


18

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

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

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


7

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`

1
Есть много разных способов добавить cronjobs, но суть ответа с высоким рейтингом и ваш ответ до сих пор @reboot.
Муру

Альтернативные методы для добавления crontabs должны быть опубликованы на askubuntu.com/q/2368/158442 , который явно о добавлении заданий Cron.
Муру

1
Позволю себе не согласиться. В основе рассматриваемого ответа используется то, crontab -eчто некоторые считают одним из черных искусств из-за vim-подобного интерфейса. С другой стороны, этот ответ может понравиться тем, чей мозг подключен определенным образом. Мы не все отлиты из одной и той же формы. С другой стороны, этот ответ уже имеет один отрицательный голос, поэтому мы позволим демократии пойти своим путем.
WinEunuuchs2Unix

2
Прошу вас. Мы оба знаем, что редактор можно заменить.
Муру

@muru Да, вероятно, потому что вы научили меня, а я научился менять редактор на что-то вроде nano или пару других CLI. Но я в лагере Гедит. Кроме того crontab -e, вспоминает звездочки ("*") на минуты, часы и т. Д., Которые я всегда находил, для которых мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.dи /etc/cron.dailyмой выбор. Тем более, что это зеркала /etc/udev/rules.dи /etc/systemd/system-sleepметоды. Это просто кажется хорошей подгонкой.
WinEunuuchs2Unix

5

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.