Implementando um 단순 백그라운드 작업 com UNIX 명명된 파이프

6247 단어 pipesunixlinux
UNIX 스트림, 파이프 및 정밀한 파이프, 익명 파이프에는 어떤 기능도 없습니다. E que estes canais são uma das bases de comunicação entre diferentes processos.

Neste artigo vamos explorar "pipes nomeados", ou named pipes , e como este modelo de dados pode ajudar a entender o funcionamento de um background job.

FIFO와 익명 파이프



FIFO "First in, first out"을 재조정하십시오.

Primeiro a entrar, primeiro a sair



Parece com filas né? 마스 엔트레탄토...

São unidirecionais



...pois caminham apenas em um sentido, e nunca de forma "bidirecional":

### ----> going this way ---->
$ echo 'my precious' | md5 | base64


Para que sejam bidirecionais, seria preciso que um processo enviasse mensagem de volta para o outro.

E há uma solução para isto.

명명된 파이프



Com o comando mkfifo , podemos criar uma pipe nomeada e usá-la entre diferentes comandos para comunicação através dos streams.

Para criar comunicação bidirectional, teríamos que criar duas FIFO, mas para nosso simples example, vamos manter unidirecional com apenas uma FIFO.

Esta pipe poderá servir como uma fila FIFO:

$ mkfifo myqueue
$ ls -la myqueue



prw-r--r--  1 leandronsp  staff     0B Jun 14 23:09 myqueue


파이프 활용



Podemos jogar saídas de comandos para dentro do pipe, por exemplo com este processo "escritor":

$ echo 'my precious' | base64 > myqueue


O processo fica bloqueado à espera que algum outro processo "leitor"leia da fila. 예를 들어:

$ cat myqueue



bXkgcHJlY2lvdXMK


O inverso também pode acontecer, onde começamos pelo leitor:

$ cat myqueue


Que fica bloqueado à espera de "mensagens na fila". E assim outro processo escritor pode enenen mensagem:

echo 'my precious' | base64 > myqueue


Janela do leitor:

bXkgcHJlY2lvdXMK


프로세스 assíncrono



Esta funcionalidade básica abre portas para o processamento assíncrono de mensagens, onde podemos ter um "worker"que fica infinitamente à espera de mensagens no pipe, ao passo que diferentes "publicadores"colocam mensagens no pipe de forma assíncrona.

Estamos falando de background jobs .

Criando um worker que decodifica base64



Vamos então criar um worker simples em Shell script que recebe uma mensagem codificada em base64, decodifica, mostra-a no screen (STDOUT) e volta para o loop à espera de mais mensagens no pipe:sidequack.sh
#!/bin/bash
## Cria o named pipe
mkfifo myqueue

echo "Waiting for jobs in the queue..."

## Loop infinito
while true
do
  ## Bloqueia à espera de mensagem no pipe
  ENCODED=`cat myqueue`

  ## Nova mensagem chegou no pipe...
  echo "Going to perform Job..."
  echo "Encoded: $ENCODED | Decoded: `echo $ENCODED | base64 -d`"
done



bash sidequack.sh



Waiting for jobs in the queue...


Agora, em outra janela, podemos colocar no pipe diferentes "jobs"a serem processados:

echo 'my precious' | base64 > myqueue
echo 'pipes are awesome' | base64 > myqueue


Podemos Consultar no terminal do worker:

Going to perform Job...                                       
Encoded: bXkgcHJlY2lvdXMK | Decoded: my precious

Going to perform Job...                                       
Encoded: cGlwZXMgYXJlIGF3ZXNvbWUK | Decoded: pipes are awesome


결론



유닉스의 기능은 유닉스에서 명명된 파이프와 다양한 종류의 프로세스에 대해 다양한 프로세스를 제공하고 있으며 FIFO는 간단한 백그라운드 작업을 구현하는 데 사용됩니다.

좋은 웹페이지 즐겨찾기