Upstart 작업이 스크립트를 두 번 시작합니다.

Upstart 작업이 스크립트를 두 번 시작합니다.

나는 간단한 Upstart 작업을 생성한 Ubuntu 14.04.4 LTS(GNU/Linux 3.13.0-85-generic x86_64)를 사용하고 있습니다.

# content of /etc/init/listener.conf

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

exec /home/mk/log_listener

스크립트 자체는 다음과 같습니다.

#!/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

그러나 어떤 이유로 작업이 두 가지 프로세스를 시작했습니다.

$ 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

나는 이것이 "정상적인" 행동이 아닌 것 같아요? 두 번째 프로세스가 시작된 사람과 이유를 어떻게 확인하고 Upstart 작업에서 스크립트를 올바르게 호출하려면 어떻게 해야 합니까?

답변1

두 프로세스가 관련되어 있고(PID 1236의 부모는 1234) PID 1234가 세션 리더(STAT 필드의 소문자 "s")임을 알 수 있습니다.

바라보다https://unix.stackexchange.com/a/18178/117549쉘 스크립트의 파이프가 새로운 프로세스 그룹을 생성하는 것을 볼 수 있습니다.

따라서 Upstart가 스크립트를 올바르게 실행하고 있으며 tail ... | while read파이프로 인해 두 개의 프로세스가 표시되고 있다고 생각합니다.

스크립트에 작은 개선 사항을 제안할 수 있다면 대신 루프 내부에 grep의 각 줄을 표시할 필요가 없습니다.

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

관련 정보