Как создать службу в Linux, которая может обрабатывать запросы?

Как создать службу в Linux, которая может обрабатывать запросы?

Я хочу создать службу Linux и иметь возможность общаться с ней. Что-то вроде базы данных, в которую я могу добавлять и получать данные. Есть ли способ общаться с моей службой, не делая ее сервером? Я имею в виду не использовать методы httpили httpsдля отправки и получения данных. Мне нужен способ подключения к службе без использования URLи portномера.

решение1

Я думаю, что ответ, который вы ищете, это использоватьsystemd.сокет

Допустим, у меня есть программа, которая читает stdin и пишет в stdout. Вы можете настроить systemd так, чтобы она была доступна через сокет.

Вот пример того, как можно настроить systemd для этой цели:

# /etc/systemd/system/simple.socket
[Socket]
Accept=yes
ListenStream=11111

# /etc/systemd/system/[email protected]
[Unit]
Description="Simple service"
After=network.target simple.socket
Requires=simple.socket

[Service]
Type=simple
ExecStart=-cat -
StanardInput=socket
StandardOutput=socket

Далее запустите сокет с помощью:

$ sudo systemctl start simple.socket

Теперь вы можете запустить службу, установив сокет. Я использую для этого ncили :netcat

$ nc 127.0.0.1 11111

В ExecStartя выбираю использовать cat -, который просто перенаправляет stdin в stdout. Когда мы запустим nc, мы обнаружим, что все, что мы введем в stdin, будет возвращено нам обратно через stdout. У вас, вероятно, есть приложение, которое более интересно, что вы захотите запустить.

Еще несколько интересных моментов:

  • catне работает, если у вас нет открытого сокета (сокет прослушивается, но служба остановлена).
  • При установлении соединения запускается служба
  • Если вы установите еще одно соединение, запустится еще один экземпляр службы.
  • При закрытии соединения служба останавливается.

решение2

Всякий раз, когда что-то получает соединения, у вас есть сервер. HTTP/S — это всего лишь один протокол из многих, многих. Вы также можете подключиться к удаленной базе данных по ее собственному протоколу. Если вы ищете более сложное решение, почитайте о туннелировании SSH — прямом и обратном. И systemdэто никоим образом не является обязательным элементом в вашем решении.

решение3

Если вы хотите получить доступ к этому только на локальной машине и хотите создавать простые скрипты, используйте fifo. Если вы хотите, чтобы другие системы в сети также имели доступ, посмотрите на netcat ( nc).

Для адептов Python есть Flask, а для программистов Perl — Dancer2.

В языке C вы бы использовали socket, bindи listen.

И как заметил @tom: systemdэто не имеет ничего общего с тем, о чем вы просите.

РЕДАКТИРОВАТЬ:

Ваше дополнение

Мне нужен способ подключения к сервису, кроме URL и номера порта.

делает совершенно непонятным, что именно вы ищете.

Если вы хотите общаться с компьютером, вы должны знать его адрес. В противном случае вы никогда не узнаете, с кем вы общаетесь. Ваша база данных и ваш клиент также должны иметь согласованный протокол. В противном случае они не поймут друг друга. И с этим у вас по необходимости есть URI.

Если вы не хотите использовать номер порта, как это делают TCP или UDP, вы можете использовать другой протокол (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) если это вам подходит. Тогда подойдет 253 или 254. Но, и, пожалуйста, не воспринимайте это как покровительство, у вас, похоже, пока нет навыков, чтобы заставить это работать.

Если вы хотите воспользоваться рекомендациями, попробуйте сначала использовать fifo на той же системе. Если это сработает, исследуйте в netcat.

Связанный контент