Як запустити сценарії при запуску?


520

Як я можу автоматично запускати скрипти при запуску Ubuntu, щоб мені не довелося запускати їх вручну після запуску?


3
Якби хтось також міг показати і КОГО, і КОГО, це було б дивним. Я говорю це тому, що знаю, що принаймні є два способи запустити сценарій, який буде запущений до запуску інших програм (наприклад, X11)
Buttink

1
Весь цей потік відповідей - безлад. Формат обміну стеками, здається, не найкраще підходить для цього питання
Габріель Ярмарок

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

Відповіді:


206

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

Зі сторони, якщо вам потрібно запустити деякі сценарії під час входу в термінал, ви можете додати їх у файл .bash_login у вашому домашньому каталозі.

Для 14.04 та старше

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

start on startup
task
exec /path/to/command

Збережіть це у .confфайлі в /etc/init(якщо вам потрібно, щоб він працював як root при завантаженні системи), або в ~/.config/upstart(якщо вам потрібно, щоб він працював як ваш користувач під час входу).


58
З огляду на те, як працює SO та StackExchange, ви можете навести приклад сценарію для запуску та де він буде розміщений? Це зробило б це набагато кращою відповіддю. У вашому посиланні вказано, що це не підтримується, і подивитися на початкову кулінарну книгу, яка є великою. У мене не надто багато ідеї, з чого почати.
Ehtesh Choudhury

2
Що робити, якщо мені потрібно запустити команду як root?
допатраман

1
@dopatraman У відповіді йдеться про те, що всі процеси з цим запускаються як root.
AStopher

4
Будь ласка, оновіть цю відповідь, щоб пояснити, що робити у системах, на яких працює systemd, а не на початку (Ubuntu 15.04+).

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

553

Один із підходів - додати завдання @reboot cron :

  1. Біг crontab -eдозволить вам відредагувати ваш cron.
  2. Додайте до нього такий рядок:

    @reboot /path/to/script
    

    виконає цей сценарій, коли комп'ютер завантажиться.


85
@rebootКлючове слово хороший наконечник , тому що це не так широко відомі.
ятанізм

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його до першого рядка.
psitae

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 для користувачів Upstart ).

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

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

Команда повинна бути віддана повним шляхом. Якщо якась команда не працює, решта не запускаються. A -перед тим, як шлях повідомляє 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 - не єдине, чого йому бракувало. Дякую!
muru

Ласкаво просимо. - Btw, RemainAfterExitзалежить від послуги, яку ви починаєте, та її бажаної поведінки. Наприклад, /bin/df -h<s> би </s> повинні були RemainAfterExit=no.
PerlDuck

@PerlDuck Немає нічого властивого dfцим потребам RemainAfterExit=no. Якщо ви хочете неодноразово виконувати команду кожного разу при запуску systemctl start foo.
муру

71

Існують різні способи автоматичного запуску команд:

  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конструкцію програмування).


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так, що може бути виконано безпосередньо командою say 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
Існує багато різних способів додати завдання, але ядро ​​голосової відповіді та вашої відповіді все ще є @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, які автоматично запускаються. Це вдосконалене рішення, як і старі сценарії init.d System-V. Це також дозволяє створити передумови до початку вашого сценарію (тобто чи потрібна мережа, що працює? Тощо)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.