
Я хочу создать службу 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.