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

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

450 голосов | спросил myusuf3 4 PM000000110000001731 2010, 23:54:17

9 ответов


190

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

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

Для 14.04 и старше

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

start on startup
task
exec /path/to/command

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

ответил LassePoulsen 5 AM00000030000002131 2010, 03:26:21
464

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

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

    @reboot /path/to/script
    

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

ответил ceejayoz 4 PM000000110000003731 2010, 23:57:37
127

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

sudo nano /etc/rc.local
ответил paolo granada lim 5 PM00000080000000531 2010, 20:40:05
68

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

  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).

ответил Riccardo Murri 5 PM00000060000005031 2010, 18:02:50
51

За 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 для пользователей Upstart ).

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

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

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

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


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

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

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

ответил muru 9 Jpm1000000pmSat, 09 Jan 2016 22:21:33 +030016 2016, 22:21:33
22
$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=

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

ответил Pandya 20 J000000Sunday14 2014, 10:14:48
18

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

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

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

ответил tutuca 4 PM000000110000004231 2010, 23:59:42
5

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

ответил txwikinger 4 PM000000110000005331 2010, 23:58:53
3

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`
ответил WinEunuuchs2Unix 3 Jam1000000amWed, 03 Jan 2018 04:02:31 +030018 2018, 04:02:31

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132