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

464

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

    
задан myusuf3 04.08.2010 в 19:54
источник

9 ответов

192

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

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

Для 14.04 и старше

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

start on startup
task
exec /path/to/command

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

    
ответ дан LassePoulsen 04.08.2010 в 23:26
источник
480

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

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

    @reboot /path/to/script
    

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

ответ дан ceejayoz 04.08.2010 в 19:57
138

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

sudo nano /etc/rc.local
    
ответ дан paolo granada lim 05.08.2010 в 16:40
68

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

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

    Вы можете ознакомиться с читаемым введением: Ссылка man-страницы man 5 init и man 8 init give вы все детали.

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

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

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

ответ дан Riccardo Murri 05.08.2010 в 14:02
53

За 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 - перед трактом сообщает systemd игнорировать ненулевой статус выхода (вместо того, чтобы рассматривать его как сбой).

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

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

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

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

    
ответ дан muru 09.01.2016 в 19:21
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 so-, который может быть выполнен непосредственно командой say myscript заменен на "</path/to/script>" ).

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

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

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

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

    
ответ дан Pandya 20.07.2014 в 06:14
18

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

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

Посмотрите Ссылка для получения дополнительной информации

    
ответ дан tutuca 04.08.2010 в 19:59
5

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

    
ответ дан txwikinger 04.08.2010 в 19:58
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 03.01.2018 в 01:02

Ознакомьтесь с другими вопросами по меткам