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


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


452
2017-08-04 19:54


Источник


Если бы кто-то мог показать как КОГДА, так и ГДЕ это было бы здорово. Я говорю это, потому что я знаю, что есть как минимум два способа запуска сценария, который будет срабатывать до того, как будут запущены другие приложения (например, X11) - Buttink
Весь этот ответ - беспорядок. Формат Stack Exchange не подходит для этого вопроса - Gabriel Fair
На самом деле это довольно интересно. Сколько может быть разных способов? - devios1


Ответы:


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

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

Для 14.04 и старше

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

start on startup
task
exec /path/to/command

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


190
2017-08-04 23:26



Учитывая, как работает SO и StackExchange, не могли бы вы привести пример сценария выскочки и где он будет размещен? Это сделало бы это гораздо лучшим ответом. В вашей ссылке говорится, что ее не поддерживают и смотрят на поваренную книгу с выскочкой, которая является huuuge. У меня нет слишком большой идеи, с чего начать. - Ehtesh Choudhury
Что делать, если мне нужно запустить команду как root? - dopatraman
@dopatraman В ответе говорится, что все процессы с этим выполняются как root. - cybermonkey
Обновите этот ответ, чтобы объяснить, что делать с системами, работающими systemd, а не с выскочкой (Ubuntu 15.04+).
Этот ответ для меня не имеет смысла. Приложения, перечисленные в system->pref->startup applications не могут быть найдены в /etc/init/ ни в ~/.config/upstart, Так где определены приложения запуска? - Blauhirn


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

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

    @reboot /path/to/script
    

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


468
2017-08-04 19:57



@reboot ключевое слово - хороший отзыв, потому что он не широко известен. - jathanism
Ницца. Есть идеи точно, когда это срабатывает? - Oli♦
Итак ... это не сработает, если я потеряю питание, и компьютер снова вернется, когда будет восстановлена ​​мощность? - Mike Wills
@siamii: man 5 crontab Говорит, что @reboot выполняется при запуске (при запуске cron-демона). - jfs
Это круто. Пока это кажется лучше, чем rc.local так как система кажется более настроенной к этому моменту (PATH и т. д.). Странно, что так сложно назвать что-то после запуск системы .. - Karthik T


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

sudo nano /etc/rc.local

128
2017-08-05 16:40



Это наиболее непосредственно отвечает на вопрос: как просто выполнять некоторые скрипты, когда ваша система загружается. upstart выполняет более сложную задачу: запускает процессы демона. - Dogweather
Итак, upstart запускает процессы демона, в то время как /etc/rc.local запускает скрипты bash? - Donato
Это должен быть принятый ответ ... - Android Dev
Должно ли это? Это уже не работает в наши дни, верно? - DaVince
Doenst работает с Ubuntu 17.04 systemd - qodeninja


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

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

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

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

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

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


68
2017-08-05 14:02



3) «Это имеет почти ту же цель и масштаб сценария .gnomerc», кроме .gnomerc очевидно работает до Загрузка Единства и Startup Applications очевидно работает после Загрузите Unity. Мне пришлось запустить программу, которая находится на панели меню Unity, и в этом случае это имело огромное значение! - That Brazilian Guy
@ ruda.almeida Спасибо, что указали это. Ответ был написан в дни доединства. - Riccardo Murri
sudo update-rc.d myscript.sh defaults, где /etc/init.d/myscript.sh - это ваш скрипт, который также запускается при запуске. - Dan Dascalescu


За 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

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

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

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

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

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


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

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

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


51
2018-01-09 19:21



можно ли задать приоритет на задание? или указать, что это зависит от другой службы, которая должна быть запущена в первую очередь? - r3wt
@ r3wt да, есть разные способы сделать это. WantedBy используемый здесь, например, заставляет его начинать, когда multi-user.target . Вы можете использовать Before, After, Requires, и т.д. man systemd.unit - muru
@PerlDuck не единственное, чего не хватало. Благодаря! - muru
Пожалуйста. - Кстати, RemainAfterExit зависит от запуска службы и ее желаемого поведения. Например, /bin/df -h <s> будет </ s> иметь RemainAfterExit=no, - PerlDuck
@PerlDuck В этом нет ничего df что необходимо RemainAfterExit=no, Если вы не будете повторно выполнять команду при каждом запуске systemctl start foo, - muru


$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=

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


22
2017-07-20 06:14





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

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

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


18
2017-08-04 19:59





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


5
2017-08-04 19:58





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
2018-01-03 01:02



Существует много разных способов добавления cronjobs, но ядро ​​ответа с высоким разрешением и ваш ответ по-прежнему остаются @reboot, - muru
Альтернативные методы добавления crontabs должны быть отправлены в askubuntu.com/q/2368/158442, что явно связано с добавлением заданий Cron. - muru
Позволю себе не согласиться. В основе рассматриваемого ответа используется crontab -e которые некоторые считают одним из черных искусств из-за виртуального интерфейса. С другой стороны, этот ответ может понравиться тем, чьи мозги связаны определенным образом. Мы не все отлиты из той же формы. И снова этот ответ уже имеет один голос, поэтому мы позволим демократии пройти курс. - WinEunuuchs2Unix
О, пожалуйста. Мы с вами знаем, что редактор можно изменить. - muru
@muru Да, возможно, потому, что вы научили меня, и я научился менять редактор на что-то вроде nano или на пару других CLI. Но я в лагере гедитов. Кроме crontab -e воспитывает воспоминания о звездочке («*») в течение минут, часов и т. д., которые я всегда обнаружил, для чего мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.d а также /etc/cron.daily мой выбор. Тем более, что это зеркало /etc/udev/rules.d а также /etc/systemd/system-sleep методы. Просто кажется, что это хорошо. - WinEunuuchs2Unix