Служба в 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 cexit 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. |