Como posso iniciar um daemon de processamento de arquivos? [fechadas]

4

Como posso executar uma ferramenta baseada em script que processa arquivos continuamente baixados para determinado diretório à medida que eles chegam? Eu gostaria de minimizar o atraso (~ 1 segundo está OK), o script pode ter loop próprio infinito.

Eu conheço algumas maneiras, como:

  • usuário autologin com .bashrc ou .profile chamando meu script
  • script fork do cron, em seguida, ignore se ele já estiver em execução
  • use scripts de init de alguma forma (acho que varia entre distribuições)

Qual método funcionaria melhor?

    
por tomash 15.05.2015 / 16:46

2 respostas

2

Supondo que seu script seja executado no Linux, você pode usar inotifywait a partir de um script de inicialização. Você provavelmente desejará uma pesquisa recursiva por toda a árvore de download (opção -r ). Tenha em atenção que cada nó para ver pode comer até 1kB de memória do kernel .

A principal vantagem de inotify é evitar um loop de polling caro. Ele aciona um evento assim que uma operação de arquivo ocorre na árvore de diretórios vigiada e consome recursos de CPU não perceptíveis de outra forma.

    
por 15.05.2015 / 17:10
9

use init scripts somehow (I guess it varies between distributions)

Realmente. Aqui está a maneira do sistema, que não envolve scripts do System 5 rc . São duas unidades. Como são unidades que não são de pacote, elas entram em /etc/systemd/system . A primeira é uma unidade de serviço que descreve a execução do seu programa como um daemon:

# /etc/systemd/system/example-spooler.service

[Unit]
Description=Process files in /var/spool/example/
Documentation=http://unix.stackexchange.com/questions/203637/

[Service]
ExecStart=/usr/local/bin/example-spooler /var/spool/example/

Observe que você não precisa iniciar ou interromper explicitamente este serviço. É caminho ativado . A unidade de caminho que descreve o caminho que o systemd monitora e o que procura é o segundo arquivo de unidade:

# /etc/systemd/system/example-spooler.path

[Unit]
Description=Watch /var/spool/example/ and activate example-spooler.service
Documentation=http://unix.stackexchange.com/questions/203637/

[Path]
DirectoryNotEmpty=/var/spool/example/

[Install]
WantedBy=multi-user.target

Para iniciar automaticamente no bootstrap, execute systemctl preset example-spooler.path . Para iniciá-lo agora, execute systemctl start example-spooler.path .

Leitura adicional

  • Lennart Poettering (2013-10-07). systemd.path . páginas de manual do systemd. freedesktop.org.
por 15.05.2015 / 19:40