
Quero criar um serviço Linux e poder me comunicar com ele. Algo como um banco de dados que posso adicionar e obter dados. Existe alguma maneira de me comunicar com meu serviço sem torná-lo um servidor? Quero dizer, não use métodos http
ou https
para enviar e obter dados. O que eu quero é uma maneira de me conectar ao serviço sem usar um número URL
e port
.
Responder1
Acho que a resposta que você está procurando é usarsystemd.socket
Digamos que eu tenha algum programa que leia stdin e grave em stdout. Você pode configurar o systemd para torná-lo acessível através de um soquete.
Aqui está um exemplo de como você configuraria o systemd para fazer isso:
# /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
Em seguida, inicie o soquete com:
$ sudo systemctl start simple.socket
Agora você pode executar o serviço estabelecendo um soquete. Eu uso nc
ou netcat
para isso:
$ nc 127.0.0.1 11111
Em ExecStart
eu escolho usar cat -
o qual simplesmente retransmite stdin para stdout. Quando executarmos nc
, descobriremos que tudo o que digitarmos em stdin será retornado para nós via stdout. Você provavelmente tem um aplicativo mais interessante que deseja executar.
Alguns outros pontos interessantes:
cat
não está em execução se você não tiver um soquete aberto (o soquete está escutando, mas o serviço está parado).- Quando você estabelece uma conexão, o serviço é iniciado
- Se você estabelecer outra conexão, outra instância do serviço será iniciada.
- Quando você fecha uma conexão, o serviço é interrompido.
Responder2
Sempre que algo está recebendo conexões, você tem um servidor. HTTP/S é apenas um protocolo entre muitos, muitos. Você também pode se conectar a um banco de dados remoto por meio de seu próprio protocolo. Se você estiver procurando uma solução mais complexa, leia sobre tunelamento SSH - direto e reverso. E systemd
não é de forma alguma um elemento obrigatório na sua solução.
Responder3
Se você deseja acessar isso apenas em sua máquina local e deseja criar scripts simples, use um fifo. Se você quiser que outros sistemas na rede também tenham acesso, consulte netcat ( nc
).
Para adeptos de Python, existe o Flask, e para programadores de Perl, o Dancer2.
Em C, você usaria socket
, bind
e listen
.
E como observou @tom: systemd
não tem nada a ver com o que você está pedindo.
EDITAR:
Sua adição
O que eu quero é uma maneira de me conectar ao serviço, exceto um URL e um número de porta.
torna completamente claro o que você está procurando.
Se quiser se comunicar com um computador, você deve saber seu endereço. Caso contrário, você nunca saberá com quem está se comunicando. Seu banco de dados e seu cliente também devem ter um protocolo acordado. Caso contrário, eles não se entenderão. E com isso, você tem necessariamente um URI.
Se você não quiser usar um número de porta, como TCP ou UDP, você pode usar outro protocolo (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) se isso lhe convier. 253 ou 254 seriam então adequados. Mas, e por favor, não tome isso como paternalista, você ainda não parece ter a habilidade necessária para fazer isso funcionar.
Se você seguir as recomendações, tente primeiro usar um fifo no mesmo sistema. Se funcionar, investigue no netcat.