
나는 간단한 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