O trabalho do Upstart inicia o script duas vezes

0

Estou usando o Ubuntu 14.04.4 LTS (GNU / Linux 3.13.0-85-genérico x86_64) onde criei uma tarefa simples do Upstart:

# content of /etc/init/listener.conf

start on runlevel [2345]
stop on runlevel [!2345]
respawn

exec /home/mk/log_listener

O script em si é assim:

#!/bin/sh

tail -F /var/log/vsftpd.log | while read line; do
    if echo "$line" | grep -q 'OK UPLOAD:'; then
         curl http://some.url/
    fi
done

Mas, por algum motivo, o trabalho inicia dois processos:

$ ps jax | grep lis
   1  1234  1234  1234 ?           -1 Ss       0   0:00 /bin/sh /home/mk/log_listener
1234  1236  1234  1234 ?           -1 S        0   0:00 /bin/sh /home/mk/log_listener

Suponho que isso não seja um comportamento "normal"? Como posso descobrir quem e por que está iniciando o segundo processo e como chamar corretamente o script no meu trabalho do Upstart?

    
por errata 14.04.2016 / 18:06

1 resposta

1

Vemos que esses dois processos estão relacionados (o pai do PID 1236 é 1234) e que o PID 1234 é o líder da sessão (minúsculas 's' no campo STAT).

Veja o link , onde vemos que os pipelines nos scripts de shell criam um novo grupo de processos.

Assim, acredito que o Upstart esteja executando seu script corretamente, e você está vendo dois processos por causa do tail ... | while read pipeline.

Se eu puder sugerir uma pequena melhoria no seu script, você não precisará repetir todas as linhas contra o grep dentro do seu loop; em vez disso:

tail -F /var/log/vsftpd.log | grep --line-buffered 'OK UPLOAD:' | while read unused
do
  curl http://some.url/
done
    
por 14.04.2016 / 18:58