#linux #сервер #faq #автозапуск
Как автоматически запускать программу при старте сервера? Без входа пользователя.
Ответы
Ответ 1
Для начала, следует выяснить, какая из систем инициализации используется в вашем дистрибутиве. Это могут быть SysVInit, Systemd, Upstart, daemontools/runit/s6 или что-то более экзотическое. Если дистрибутив современный и популярный - в нём, скорее всего, будет использоваться Systemd. Если дистрибутив древний - то там будет SysVInit. Ну а между этими крайностями может происходить всё что угодно. Далее, следует искать способ сделать искомое уже в рамках вашей системы инициализации. Ниже я привожу примерные способы добиться желаемого в разных системах инициализации - но лучше смотрите документацию. Systemd, признак наличия - директория /etc/systemd и программа systemctl Для автозапуска программы на системе с systemd нужно создать unit-файл и положить его в директорию /etc/systemd/system/ Имя файла будет идентификатором службы. Расширение у файла должно быть .service Минимальный файл: [Service] ExecStart=/path/to/program WorkingDirectory=... User=... Group=... [Unit] After=network.target [Install] WantedBy=multi-user.target Здесь строка After=network.target означает, что службу нужно загружать только после того как сетевые подключения начнут работать. А WantedBy=multi-user.target означает, что служба должна загружаться при обычном старте сервера. Также тут предполагается, что программа после запуска просто начнёт работать, и будет работать пока пока не получит сигнал SIGTERM. Если программа должна поработать и перестать - надо ещё дописать в раздел [Service] настройку Type=oneshot. Ну а если программа - классический демон, то её надо прописывать Type=forking и настройки ExecStop, PIDFile За дополнительными настройками можно заглянуть в man systemd.unit, man systemd.service и man systemd.exec Теперь осталось включить службу: systemctl enable имя_службы и запустить её: systemctl start имя_службы. SysVInit, признак наличия - директории /etc/rc.d и /etc/init.d (последняя также может находиться по пути /etc/rc.d/init.d) и обязательное отсутствие признаков других систем инициализации Другие системы инициализации могут частично поддерживать sysvinit-скрипты, но нет смысла составлять новый sysvinit-скрипт если можно составить что-то другое. Тут проще всего добавить запуск вашей программы в файл rc.local: #!/bin/bash /path/to/program & exit 0 Но если её при этом нужно ещё и останавливать - придётся писать полноценный скрипт в директории /etc/init.d: #!/bin/bash case "$1" in start) команды для запуска демона ;; stop) команды для остановки демона ;; esac Также могут понадобиться команды status, restart, reload и пр. Посмотрите как написаны остальные скрипты в папке /etc/init.d Если запускаемая программа не является демоном - придётся также найти и использовать обертку-демонизатор, вроде программы start-stop-daemon Не забудьте сделать скрипт исполняемым (chmod +x /etc/init.d/имя) После создания нового скрипта в папке init.d нужно его включить, сделав жесткие ссылки в папке /etc/rc.d. Обычно они делаются вот так: update-rc.d имя defaults update-rc.d имя enable Также возможен вариант с chkconfig, но тут придётся добавить в скрипт комментарий специального вида: # chkconfig: - 98 02 chkconfig --add имя Возможен и вариант что у вас настолько старый дистрибутив, что нужные ссылки придётся делать вручную. Это уже выходит за рамки ответа, гуглите структуру rc.d и уровни запуска Upstart, признаки - директория /etc/init Тут нужно составить конфиг и положить его в /etc/init exec /path/to/program start on runlevel [23] runit, признаки - директории /etc/sv, /etc/runit и /etc/service (или /var/service) Нужно создать каталог /etc/sv/имя_службы, а в нём - файл исполняемый run: #!/bin/bash exec /path/to/program Теперь этот сервис можно включить командой ln -s /etc/sv/имя_службы /etc/service/имя_службы
Комментариев нет:
Отправить комментарий