Программирование PC Ubuntu: как написать простейший сервис Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Ubuntu: как написать простейший сервис Печать
Добавил(а) microsin   

Служба в Linux (иногда их называют "демон") это программа, которая обычно автоматически стартует при запуске системы скриптами, находящимися в каталоге /etc/init.d. Фактически это обычная программа, в которой просто добавлен функционал для запуска, остановки и перезапуска сервиса. В этой статье описывается создание простейшего сервиса Ubuntu, который умеет только запускаться и останавливаться.

Процесс по шагам, на примере создания сервиса myfirstservice:

1. Создайте папку myfirstservice, перейдите в её каталог. Имя каталога может быть любым, здесь каталог myfirstservice указан только для примера:

$ mkdir myfirstservice
$ cd myfirstservice

2. Создайте в папке myfirstservice файл main.c со следующим содержимым:

#include < stdio.h>
#include < stdlib.h>
#include < signal.h>
#include < unistd.h>

#define SERVICE_NAME "myfirstservice"

void _teminateAction(int signum, siginfo_t *siginfo, void *code)
{ printf("%s was stopped\n", SERVICE_NAME); exit(0); }

int main(void) { struct sigaction act; act.sa_sigaction = _teminateAction; act.sa_flags = SA_SIGINFO; sigaction(SIGTERM, &act, 0);
printf("*** %s ***\n", SERVICE_NAME);
while (1) { sleep(1); }
return 0; }

3. Скомпилируйте эту программу:

$ gcc -o myfirstservice main.c

В результате получится бинарный файл myfirstservice, это и есть исполняемый файл для нашей службы.

4. Создайте скрипт для запуска нашего сервиса, и дайте ему произвольное имя, например myfirstservice_svc:

#!/bin/sh
SVC="myfirstservice"
pid=`ps -aux | awk '{if (match($11, "'.*/$SVC$'")) print $2}'`

start() { if [ "$pid" = "" ] then echo "Starting $SVC service" /usr/sbin/myfirstservice& else echo "Already started $SVC service" echo "PID: $pid" fi }

stop() { if test "$pid" != "" then echo "Stopping $SVC service" echo "PID: $pid" kill $pid else echo "Not started $SVC service" fi }

restart() { echo "Restarting $SVC service" stop pid="" start }

help() { echo "Help for $SVC service" echo " start start service" echo " stop stop service" echo " restart restart service" echo " help this help" }

case "$1" in start) start ;; stop) stop ;; restart) restart ;; help) help ;; *) echo "Usage: $0 [start|stop|restart|help]" exit 1
esa
c
exit 0

Самое важное в этом скрипте это строка, где скрипт с помощью утилиты awk [3] вычисляет PID службы. В зависимости от версии операционной системы эта строка может отличаться. Различия зависят от реализации команды ps, как она формирует вывод таблицы процессов. Например, на маршрутизаторе Realtek, где работает операционная система Linux на основе ядра 5.10.70, эта строка может быть такой:

pid=`ps | awk '{if (match($5, ".*/myfirstservice$") || $5 == "myfirstservice") print $1}'`

Могут быть и другие отличия, которые потребуют адаптации скрипта под конкретный шелл. Например, проверка $pid может быть следующей:

if test "$pid" == ""

5. Сделайте копию исполняемого файла myfirstservice в каталог, где находятся утилиты, которые можно запустить без указания полного пути (этот каталог прописан в переменную окружения $PATH). Например, это может быть каталог /usr/sbin:

$ chmod +x myfirstservice
$ sudo cp myfirstservice /usr/sbin

6. Сделайте файл скрипта myfirstservice_svc исполняемым, и поместите его в каталог /etc/init.d.

$ chmod +x myfirstservice_svc
$ sudo cp myfirstservice_svc /etc/init.d/

Готово! После перезагрузки служба myfirstservice автоматически запустится, и будет висеть в памяти. Проверить это можно командой ps -aux:

$ ps -aux | grep /usr/sbin | grep myfirstservice
usernam+  833778  0.0  0.0   2780  1408 pts/5    S    11:04   0:00 /usr/sbin/myfirstservice

Также с помощью скрипта myfirstservice_svc командами stop, start и restart вы сможете останавливать, запускать и перезапускать службу myfirstservice:

$ /etc/init.d/myfirstservice_svc stop
Stopping myfirstservice service
PID: 833778
myfirstservice was stopped
$ /etc/init.d/myfirstservice_svc start
Starting myfirstservice service
*** myfirstservice ***
$ /etc/init.d/myfirstservice_svc restart
Restarting myfirstservice service
Stopping myfirstservice service
PID: 843035
Starting myfirstservice service
myfirstservice was stopped
*** myfirstservice ***

Команда service. Команда service --status-all позволяет просмотреть статус всех служб. Интересующую нас службу можно отфильтровать командой grep:

$ service --status-all | grep myfirstservice
 [ ? ]  myfirstservice_svc

[Ссылки]

1. How to Start, Stop or Restart Services in Ubuntu site:vitux.com.
2. Linux List Processes How to Check Running Processes site:freecodecamp.org.
3. awk General Introduction site:gnu.org.

 

Добавить комментарий


Защитный код
Обновить

Top of Page