Как автоматически запустить приложение при загрузке


27

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

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

Каким должно быть расширение и имя этих файлов скриптов? Можем ли мы добавить символическую ссылку вручную rc.dили есть какая-то особая процедура для этого?

Любое предложение, как этого добиться?


Предпочтительный способ добавления сценария инициализации в автозагрузку зависит от дистрибутива. Некоторые даже отказываются от них в пользу upstart и systemd. Я бы не рекомендовал просто использовать «&» в качестве фона, так как что-то вроде Debian start-stop-daemonсправляется с этим лучше (хотя это предпочтительнее, программа сама демонизирует). Какой дистрибутив вы используете? Вне настольных MIME-типов расширения файлов не имеют смысла в * nix, и предпочтительно, чтобы в исполняемых файлах их не было.
Иордания

Если вы используете petalogix, просто следуйте этой документации - никаких специальных имен не требуется, просто делайте, как они говорят. Вы пробовали это? Какие у тебя проблемы? (Если нет, укажите ваш дистрибутив и объясните, что не работает с тем, что вы пробовали.)
Мат

Я использую Debian «wheezy» для RPi.
ущелье

1
если вам нужно сделать это примерно каждые 10 секунд (то есть не 10 секунд), вы можете использовать cronвместо этого.
Петер

@peterph: но похоже, что программа переключает светодиод каждые 10 секунд, а не программу, которая выполняется каждые 10 секунд.
Zorawar

Ответы:


19

Вот выдержка из http://www.debian-administration.org/articles/28, которая, кажется, отвечает на ваш вопрос.

Примечание. В приведенном ниже примере сценария просто добавьте вызов в start)раздел « », чтобы фактически запустить вашу программу. Вы можете проверить работоспособность скрипта, не перезагружая систему: вызвать его с полным путем и присвоить ему параметр " start" или " stop"

Вот оно:

Debian использует систему инициализации, подобную Sys-V, для выполнения команд при изменении уровня выполнения системы - например, во время загрузки и завершения работы.

Если вы хотите добавить новый сервис для запуска при загрузке машины, вы должны добавить в каталог необходимый скрипт /etc/init.d/ . Многие из сценариев, уже присутствующих в этом каталоге, дадут вам пример того, что вы можете сделать.

Вот очень простой скрипт, который разделен на две части: код, который всегда выполняется, и код, который запускается при вызове с помощью «start» или «stop».

#! /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, указано местоположение оболочки?
user137717

Я получаю "-sh: update-rc.d: команда не найдена"
m4l490n

2
Новые системы используют systemdдля многих вещей, в том числе для конфигурации загрузки. Используйте systemctlдля управления и настройки systemd.
Александр Щебликин

4

Лучший способ - проверить источник пакета вашего дистрибутива на наличие регулярной системной службы, например, для OpenSSH - вы увидите, каковы хорошие практики. В конце концов, одной из причин открытого исходного кода является возможность учиться у источников.


2
Отличный совет! Поистине мудрый и актуальный, настроенный на все Distos. (И, между прочим, отвечает на вопрос «новичок в Linux» и «как мне это сделать»). Я буду использовать этот ответ для улучшения своих сценариев запуска-остановки.
Bruce0

3

Используйте Supervisor, эффективную программу, которая управляет и регистрирует приложения запуска с аргументами. Узнайте больше на http://supervisord.org/running.html и (следуйте инструкциям по установке.

Создайте файл conf в /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для редактирования пользовательского crontab.
Добавьте следующую строку в конце:

@reboot <command>

Примеры:

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

Наконец, используйте, crontab -lчтобы убедиться, что ваш скрипт был добавлен в список.


Интересно, почему этот ответ получил отрицательные отзывы? Похоже, очень простое решение, в котором используется crontab - который, наверное, все уже знают и понимают.
Колинко

1

Поддержка более новых версий linux systemd(как сказал @AlexanderShcheblikin). Он имеет больше функций и более переносим, ​​чем специфичное для Debian решение.

Пожалуйста, прочитайте это действительно отличное руководство .

Вот краткий справочник о необходимом минимуме :

  1. Скрипт (например myscript.sh) с исполняемыми разрешениями.
  2. Файл модуля (например 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.