따라서 애플리케이션이 완전히 로드된 후 /tmp를 정리하려면 시작 스크립트를 수정해야 합니다. 몇 가지 조사 끝에 다음과 같은 스크립트 명령을 발견했습니다.
tail -f /home/user1/logs/application.log | awk '/Application is fully up and running/ { system("pm2 restart cleantmp"); exit 1; }'
echo "Startup complete"
기본적으로 "애플리케이션이 완전히 작동하고 실행 중" 모드가 있는지 스크립트의 모든 줄 바꿈을 확인하고, 그런 일이 발생하면 pm2를 사용하여 정리 프로세스를 다시 시작합니다.
이는 응용 프로그램이 시작된 후 /tmp를 정리하는 것 같습니다. 그러나 콘솔이 거기에서 멈추고 서버 출력을 표시하며 절대 종료되지 않는 문제가 발생합니다. 오류로 인해 실패하거나 실패하지 않습니다. 전혀 echo 문에 도달하지 않고 CTRL+C를 사용할 때까지 기다립니다.
이 사이트에 대한 조사를 바탕으로 tail 및 sed를 사용하여 다른 버전을 사용해 보았습니다.
tail -f /home/user1/logs/application.log | grep --line-buffered -q 'Application is fully up and running' | while read ; do pm2 restart cleantmp ; done
tail -f /home/user1/logs/application.log | sed "/Application is fully up and running/q"
두 경우 모두 스크립트는 정리 작업도 수행하지 않습니다. "ps -aux | grep tail"을 사용한 추가 테스트에서는 이것이 확실히 tail -f
스크립트 완료를 방해하는 것으로 나타났습니다. 비슷한 사용 사례를 가진 사람이 있습니까? 어떤 조언이라도 대단히 감사하겠습니다.
답변1
그리고
tail -f /home/user1/logs/application.log |
grep --line-buffered -q 'Application is fully up and running' |
while read ; do pm2 restart cleantmp ; done
-q
출력을 생성하지 않으려면 Tell을 사용 grep
하고 원하는 내용을 읽으려는 루프에 파이프합니다. 다음을 시도해 볼 수 있습니다.
tail -f /home/user1/logs/application.log |
grep --line-buffered -q -m 1 'Application is fully up and running'
pm2 restart cleantmp
그러나 꼬리는 다음 줄이 입력 파일에 기록될 때까지 끝나지 않습니다. 문제 설명에서는 그런 일이 발생하지 않는다고 생각하므로 문자열을 찾는 스크립트에서 입력 파일에 빈 줄을 다시 쓸 수 있습니다. 해당 스크립트를 종료하고 있습니다. 찾기 전에:
file='/home/user1/logs/application.log'
tail -f "$file" |
awk -v file="$file" '/Application is fully up and running/{exit} END{print "" >> file}'
pm2 restart cleantmp
이것은 약간 해킹적이지만 입력 파일에 빈 줄을 추가하는 데 신경 쓰지 않는 한 작동합니다.
결국 가장 간단한 해결책은 tail
원하는 문자열이 나타날 때까지 무한 루프에서 매초마다 awk를 잊어버리고 호출한 다음 루프에서 벗어나는 것입니다.
while :; do
awk '/Application is fully up and running/{f=1; exit} END{exit !f}' && break
sleep 1
done < '/home/user1/logs/application.log'
pm2 restart cleantmp
마지막으로 찾고 있는 최종 메시지가 로그 파일에 한 줄로 기록되었다고 가정합니다.