Як запустити послугу автоматично при запуску Ubuntu?


31

Я використовую Ubuntu 12.04 і хочу запустити послугу, коли система завантажиться нормально.

Як "послуга" я розумію деякий код, наприклад, cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x, який просто повинен працювати так, як ніби він був запущений у командному рядку. Є сервіси, які потрібно запустити як звичайний користувач, але також і сервіси, які потрібно запустити як root (насправді не потрібно, щоб служби запускалися на рівні користувача).

Мені також потрібно налаштувати поведінку, коли "послуга" припиняється. Я хочу, щоб вони були перезапущені в моєму випадку, з тим же аргументом, у визначеному каталозі.

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

В Інтернеті є кілька документів, але вони мене бентежать. Вони не говорити про те init, init.d, rc.d, але я ніколи не бачив простий у наступною крок за кроком інструкції легко в якості служби з використанням , наприклад , вискочка. Якщо це легко, я би вдячний, якщо ці кроки наведені тут.

Відповіді:


33

Щоб створити завдання, яке потрібно запустити автоматично при запуску Ubuntu, використовуйте наведений тут приклад . Як письмовий приклад, припустимо створити наступний файл /etc/init/testservice.confз sudo:

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

Щоб "вручну" запустити або припинити використання процесу

sudo start testservice
sudo stop testservice

Дивіться команди контролю завдань .


Щоб запустити послугу, мені знадобилося "стартувати на стартовому монтажі".
понедельник від

23

Добре, Алекс, справа в тому, що всі процеси простору користувачів в Linux запускаються з initпроцесу, чий pid - 1. Наприклад, запустіть, pstreeщоб побачити дерево ваших процесів, корінь якого є init .. На сьогоднішній день існує кілька версій впровадження initпроцесів. , найбільш помітні

  • sysVinit (класичний init, який все ще використовується деякими дистрибутивами, включаючи старіші Debian)
  • Upstart init, який використовується старшими Ubuntu та деякими версіями RHEL (Red Hat) та старішими версіями Fedora
  • systemd init, використовуваний сучасними версіями Fedora, Ubuntu, Debian, RHEL, SUSE

Традиційно Unix'es використовував init-реалізацію під назвою sysVinitinit, яку називають іменем https://ru.wikipedia.org/wiki/UNIX_System_V версії Unix. Він дуже впливовий, інші інітити сумісні з ним назад.

В основному, sysVinit спочатку зчитує /etc/inittabфайл, вирішує, який запуску рівня запускати, і каже /etc/init.d/rcскрипту виконувати так звані скрипти init. Наприклад, коли він зазвичай завантажується на багатокористувацький пробіг, який, як правило, працює на рівні Ubuntu 2 , /etc/init.d/rcпочинає виконувати сценарії в /etc/rc2.d. У файлах є лише символічні посилання на скрипти, а самі сценарії зберігаються в /etc/init.dкаталозі. Називання цих посилань у /etc/rc*.dдовідниках відбувається таким чином. Скажімо, у нас є такі сценарії /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

Це означає, що при переході на runlevel 2 init процес спочатку вбиває network-managerпроцеси, викликає його ім'я скрипта починається з K-, K02network-managerа потім починає процеси, імена яких починаються з S. Двозначні цифри після Sабо K- це число від 00 до 99, яке визначає порядок, процеси запускаються. Наприклад rsyslog, запускається раніше apache2, тому що 16 менше 17 (це має сенс, тому що потрібно, щоб апаш покладався на можливості реєстрації rsyslog , тому спочатку слід запустити rsyslog). Сценарії - це випадкові сценарії оболонки, виконані #!/bin/sh.

Отже, в основному, щоб запустити програму при запуску в стилі sysVinit, напишіть власний скрипт (скопіюйте його з будь-якого прикладу, який ви отримали /etc/init.d), поставте його /etc/init.dта створіть до нього симпосилання під розумною назвою, наприклад, S99mytrojanв /etc/rc2.d. Ось пояснення типових сценаріїв sysVinit у /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

Тепер хлопці Ubuntu вирішили, що хочуть додаткової функціональності від init. Вони хотіли швидкої завантаження ОС, тому хотіли, щоб їхні сценарії виконувалися паралельно; вони хотіли автоматичного запуску мертвих процесів; вони хотіли, щоб процеси явно викликали один одного подіями (так, щоб apache управлявся подією "запущений syslog", а syslog керувався подією "встановлена ​​файлова система" тощо), тому у нас є події замість деяких чисел 00 -99). Таким чином, вони зробили Upstart і ось як це працює. Вищезапущені initscripts поміщаються в /etc/initкаталог (не плутати з /etc/init.d). Запуск запуску зазвичай /etc/init.d/rcтеж працює , тому він буде виконувати ваші сценарії sysVinit нормально. Але якщо ви хочете, щоб ваш сценарій був відтворений після виходу - Upstart події для вас.

Хоча я не можу перевірити, чи працює мій сценарій, я думаю, що для ваших цілей слід написати наступний /etc/init/mytrojan.confсценарій:

start on runlevel [02]
respawn
exec mytrojan --argument X 

Але якщо вам потрібні залежності, принаймні файлові системи та мережа, можливо, має сенс замінити start on runlevel [02]щось на кшталт:

start on (local-filesystems and net-device-up IFACE!=lo)

Попередження: Я не перевірив правильність цього, тому що не можу. Тим більше, я не зовсім впевнений у тому, як запустити скрипт після того, як ваше мережне з'єднання буде запущене (я використовував цю версію ). Спробуйте googling для "швидкої запуску в мережі".


1
Це дуже приємний огляд історії процесу, розпочатого в Linux, але він не дає відповіді на питання. Я досі не знаю, як "створити" процес на початку. Я також просто хочу використовувати його, не розуміючи кожного крихітного шматочка того, як це працює. Мені просто хотілося мати простий і простий у використанні робочий приклад того, як створити процес, який потрібно запустити і відновити автоматично, за допомогою запуску ubuntu..l.
Алекс

@Alex: оновлений зразок шип. Зауважте, що мій сценарій може бути неправильним. Я зробив це в дусі alexreisner.com/code/upstart .
Борис Бурков

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