Як запустити додаток автоматично під час завантаження


27

Я новачок у Linux і з нетерпінням чекаю запуску програми (яка змінює світлодіодні кожні 10 секунд). Я написав програму програми, і вона працює нормально, але тепер я хочу запустити її автоматично під час завантаження.

Документація тут говорить про те, щоб скопіювати сценарій запуску в /etc/init.dкаталог і зробити символьне посилання на скопійований скрипт у rc.dкаталозі.

Яким має бути розширення та назва цих файлів скриптів? Чи можемо ми вручну додати символьне посилання rc.dабо існує певна процедура для цього?

Будь-яка пропозиція, як цього досягти?


Кращий спосіб додати сценарій init до запуску залежить від distros. Деякі навіть поступово припиняють їх на користь випереджаючих та системних. Я б не рекомендував просто використовувати "&" для фонового start-stop-daemonрежиму , оскільки щось на зразок Дебіана обробляє це краще (хоча краще, що програма сама себе демонструє). Який дистрибутив ви використовуєте? Поза MIME типів настільних файлів, розширення файлів у * nix не мають сенсу, і бажано, щоб його не було.
Йорданм

Якщо ви використовуєте petalogix, просто дотримуйтесь цієї документації - ніяких спеціальних імен не потрібно, просто так, як вони кажуть. Ви пробували? Які у вас проблеми? (Якщо ні, то вкажіть свій дистрибутив і поясніть, що не працює з тим, що ви спробували.)
Мат

Я використовую «wheezy» Debian для RPi.
ущелина

1
якщо вам потрібно робити це приблизно кожні 10 секунд (тобто не гострі 10 секунд), ви можете скористатися cronнатомість.
peterph

@peterph: але це здається, що програма перемикає світлодіод кожні 10 секунд, а не програма, яка виконується кожні 10 секунд.
Зоравар

Відповіді:


19

Ось уривок з http://www.debian-administration.org/articles/28, який, здається, відповідає на ваше запитання.

Примітка. У наведеному нижче прикладі просто додайте виклик до розділу, який " start)" фактично запускає вашу програму. Ви можете перевірити функціональність сценарію, не перезавантажуючи систему: викликайте його з повним шляхом та надаючи йому параметр " start" або " stop"

Ось:

Debian використовує подібну Sys-V систему init для виконання команд при зміні рівня роботи системи - наприклад, під час завантаження та відключення.

Якщо ви хочете додати нову послугу для запуску, коли машина завантажується, ви повинні додати необхідний скрипт до каталогу /etc/init.d/. Багато сценаріїв, які вже є у цьому каталозі, дадуть вам приклад того, що ви можете робити.

Ось дуже простий скрипт, який розділений на дві частини, код, який завжди працює, і код, який запускається, коли викликається зі "пуском" або "зупинкою".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Після збереження файлу у правильному місці переконайтесь, що його можна виконати, запустивши " chmod 755 /etc/init.d/blah".

Тоді вам потрібно додати відповідні символічні посилання, щоб спричинити виконання сценарію, коли система виходить з ладу або з'являється.

Найпростіший спосіб зробити це - використовувати специфічну для Debian команду update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

чи потрібно насправді розміщувати цей скрипт у etc / init.d / чи рядок вгорі, # /etc/init.d/blah, вказує розташування в оболонці?
користувач137717

Я отримую "-sh: update-rc.d: команду не знайдено"
m4l490n

2
Новіші системи використовують systemdдля багатьох речей, в тому числі для конфігурації завантаження. Використовуйте systemctlдля керування та налаштування systemd.
Олександр Щеблікін

4

Найкращий спосіб - перевірити джерело пакунків вашої дистрибуції для звичайної системної служби, наприклад, для OpenSSH - ви побачите, які хороші практики. Зрештою, однією з причин відкритого джерела є можливість вчитися з джерел.


2
Відмінна порада! По-справжньому мудрий і релевантний і налаштований на всі Дисто. (І, до речі, відповідає на питання "нове в Linux" та "як я це роблю". Цю відповідь я використаю для вдосконалення сценаріїв початку зупинки.
Bruce0,

3

Використовуйте Supervisor - ефективну програму, яка керує та записує в програму запуску аргументи. Дізнайтеся більше на веб-сайті http://supervisord.org/running.html та (Дотримуйтесь інструкцій із встановлення.

Створіть конф-файл за адресою /etc/supervisor/conf.d/{PROGRAM_NAME}.confта ось код,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Потім виконати з cmd рядка:

supervisorctl reload


Тоді як ваша відповідь чудова, я думаю, ви повинні змінити її, щоб показати, що "перезавантаження supervisorctl" повинно виконуватися з CLI, а не вставляти його у файл .conf
dlewin

3

Використовувати crontabнабагато простіше.

Використовуйте crontab -eдля редагування кронтабулятора користувача.
Додайте наступний рядок у кінці:

@reboot <command>

Приклади:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Нарешті використовуйте, crontab -lщоб переконатися, що ваш сценарій був доданий до списку.


Цікаво, чому ця відповідь отримала зворотний зв'язок? Здається, це дуже просте рішення і таке, що використовує кронтаб - яке, напевно, всі вже знають і розуміють.
kolinko

1

Новіші версії підтримки Linux systemd(як сказав @AlexanderShcheblikin). Він має більше функцій і є більш портативним, ніж для конкретного рішення.

Будь ласка, прочитайте цей справді чудовий путівник .

Ось коротка довідка про необхідний мінімум :

  1. Сценарій (наприклад myscript.sh) з виконаними правами.
  2. Файл Unit (наприклад myservice.service) з розширенням ".service" /etc/systemd/systemз 644 дозволами, який містить команду для виконання сценарію. Наприклад,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Виконайте команду, sudo systemctl enable myserviceщоб включити її до запуску під час завантаження.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.