Як я можу автоматично запускати скрипти при запуску Ubuntu, щоб мені не довелося запускати їх вручну після запуску?
Як я можу автоматично запускати скрипти при запуску Ubuntu, щоб мені не довелося запускати їх вручну після запуску?
Відповіді:
В залежності від того, якого роду сценаріїв , які необхідно запустити .. Для послуг тощо , ви повинні використовувати вискочку . Але для користувацького сценарію вони повинні бути запущені як gnome сценарії сеансу! Перегляньте розділ Система> Налаштування> Запуск програм.
Зі сторони, якщо вам потрібно запустити деякі сценарії під час входу в термінал, ви можете додати їх у файл .bash_login у вашому домашньому каталозі.
Проста команда (та, якій не потрібно залишатись запущеною) може використовувати завдання Upstart на зразок:
start on startup
task
exec /path/to/command
Збережіть це у .conf
файлі в /etc/init
(якщо вам потрібно, щоб він працював як root при завантаженні системи), або в ~/.config/upstart
(якщо вам потрібно, щоб він працював як ваш користувач під час входу).
system->pref->startup applications
не можна ні знайти, /etc/init/
ні ~/.config/upstart
. То де визначаються програми запуску?
Один із підходів - додати завдання @reboot cron :
crontab -e
дозволить вам відредагувати ваш cron.Додайте до нього такий рядок:
@reboot /path/to/script
виконає цей сценарій, коли комп'ютер завантажиться.
@reboot
Ключове слово хороший наконечник , тому що це не так широко відомі.
man 5 crontab
каже, що @reboot
виконується при запуску (коли запускається демон cron).
rc.local
оскільки система здається більш налаштованою до цього моменту (PATH тощо). Дивно, що після запуску системи так важко щось зателефонувати ..
Як щодо додавання команди до /etc/rc.local
? вам доведеться використовувати доступ sudo, хоча для редагування цього файлу.
sudo nano /etc/rc.local
chmod 755 rc.local
і додати #!/bin/bash
його до першого рядка.
Для запуску команди (короткотривалої) 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 На відміну від довгоживучих демонів.
WantedBy
використане тут, наприклад, запускає його, коли multi-user.target
буде досягнуто значення. Ви можете використовувати Before
, After
, Requires
і т.д. Дивman systemd.unit
RemainAfterExit
залежить від послуги, яку ви починаєте, та її бажаної поведінки. Наприклад, /bin/df -h
<s> би </s> повинні були RemainAfterExit=no
.
df
цим потребам RemainAfterExit=no
. Якщо ви хочете неодноразово виконувати команду кожного разу при запуску systemctl start foo
.
Існують різні способи автоматичного запуску команд:
Вискочка система буде виконувати всі сценарії , з яких він знаходить конфігурацію в каталозі /etc/init
. Ці сценарії виконуватимуться під час запуску системи (або у відповідь на певні події, наприклад, запит на вимкнення), і тому це місце для запуску команд, які не взаємодіють з користувачем; всі сервери запускаються за допомогою цього механізму.
Ви можете ознайомитись із ознайомленим вступом на веб-сторінці: http://upstart.ubuntu.com/getting-started.html довідкових сторінок man 5 init
та man 8 init
надати повну інформацію.
Сценарій оболонки, названий .gnomerc
у вашому домашньому каталозі, автоматично надходить кожного разу при вході в сеанс GNOME. Ви можете помістити туди довільні команди; змінні середовища, які ви встановили в цьому сценарії, побачать будь-яка програма, запущена в сеансі.
Зауважте, що сеанс не починається до завершення .gnomerc
сценарію; тому, якщо ви хочете автозапустити якусь тривалу програму, вам потрібно додати &
виклик програми, щоб відірвати її від запущеної оболонки.
Опція меню Система -> Налаштування -> Запуск програм дозволяє визначити, які програми слід запускати, коли розпочнеться графічний сеанс (Ubuntu заздалегідь визначено досить багато), і додати або видалити їх на свій смак. Це майже однакове призначення та сферу дії .gnomerc
сценарію, за винятком того, що вам не потрібно знати sh
синтаксис (але ви також не можете використовувати будь-яку sh
конструкцію програмування).
.gnomerc
очевидно, працює перед завантаженням Unity, і, Startup Applications
мабуть, працює після завантаження Unity. Мені довелося запустити програму, яка сидить на панелі меню Unity, і це зробило величезну зміну в цьому випадку!
sudo update-rc.d myscript.sh defaults
, де /etc/init.d/myscript.sh - ваш сценарій, він також запускається при запуску.
$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=
Отже, ви можете запустити потрібний скрипт оболонки при запуску!
Для простих речей ви можете додати команду в System-> Preferences-> Sessions, що вказує на місце вашого сценарію.
Крім того, ви можете додати його до /etc/init.d/rc.local або зробити роботу з початком роботи, якщо мова йде про більш низький рівень .
Подивіться на https://help.ubuntu.com/community/UbuntuBootupHowto для отримання додаткової інформації
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`
@reboot
.
crontab -e
що деякі вважають одним із чорних мистецтв завдяки інтерфейсу, подібному до vim. З іншого боку, ця відповідь може сподобатися тим, у кого мозок певним чином підключений. Ми не всі литі з однієї форми. Тоді знов у цій відповіді вже є один голос, який дозволить демократії взяти курс.
crontab -e
містить спогади про зірочки ("*") на хвилини, години та ін., Для яких я завжди знаходив, що мені потрібно вказувати інструкції Google. Я все ще знаходжусь, /etc/cron.d
і /etc/cron.daily
я йду до вибору. Тим більше, що це дзеркала /etc/udev/rules.d
та /etc/systemd/system-sleep
методи. Це просто здається приємним пристосуванням.
Ви повинні скористатися для цього запуском . Upstart використовується для процесів Ubuntu, які автоматично запускаються. Це вдосконалене рішення, як і старі сценарії init.d System-V. Це також дозволяє створити передумови до початку вашого сценарію (тобто чи потрібна мережа, що працює? Тощо)