감사 로그를 채우는 임시 사전 연결 프로세스가 있지만 해당 프로세스가 무엇인지 잘 모르겠습니다. 오류 로그는 PID를 제공하지만 잘못되면 프로세스가 종료되는 것 같아서 거의 즉시 사라집니다.
내가 원하는 것은 테일 로그를 작성하고 PID를 grep하여 "ps -p" 또는 "ps -ef |"로 펌핑하는 것입니다. PID를 grep'.
내가 지금까지 얻은 것은 다음과 같습니다
ps -p $(tail -f /var/log/audit/audit.log | grep 'comm="prelink"' | grep -o 'pid=[0-9]* ' | grep -o [0-9]*)
그러나 쉘 확장은 업데이트되지 않은 것 같습니다. 즉, 명령을 실행했는데 로그의 마지막 항목에서 찾은 PID가 1234라고 가정하면 ps는 해당 항목을 검색만 하고 업데이트하지 않습니다.
tail의 출력을 PS로 무한 반복하거나 PS로 greping하는 다양한 변형을 시도했지만 진전이 없었습니다. 업데이트된 시기를 확인하기 위해 별도의 창에서 로그의 tail -f를 실행했지만, 해당 PID에 대한 PS를 가져오는 명령이 응답하지 않았습니다.
누구든지 내가하려는 일을 달성하는 방법을 제안 할 수 있습니까?
또한 이 작업을 수행하는 매우 간단하고 더 좋고 확실한 방법이 있습니까? 저는 경험이 많지 않고 일을 지나치게 복잡하게 만드는 습관이 있습니다. 따라서 "왜 X만 하면 안 됩니까?"가 있다면 자유롭게 던져보세요!
매우 감사합니다! 비.
답변1
와 같은 표현은 항상 인용해야 합니다 [0-9]*
.
tail -f /var/log/audit/audit.log |
grep --line-buffered 'comm="prelink"' |
grep --line-buffered -o 'pid=[0-9]* ' |
grep --line-buffered -o '[0-9]*' |
while read pid; do
ps -p "$pid"
done
tail -f
출력을 버퍼링하지 않습니다. 다른 응용 프로그램의 경우 unbuffer
여전히 stdbuf
문제가 해결됩니다.
답변2
항상 무한 루프에서 실행하고 버퍼링 문제를 피할 수 있습니다. 아마도 오랫동안 실행하지 않을 것이고 수동으로 중지할 수 있으므로 다음을 실행하십시오.
while true; do
ps -p $( tail -n1 /var/log/audit/audit.log |
grep -oP 'comm="prelink".*pid=\K[0-9]*' ) 2>/dev/null
그러면 파일의 마지막 줄이 계속해서 인쇄되고 PID(있는 경우)를 추출한 후 ps -p
실행됩니다. PID가 없으면 오류가 발생하므로 오류 출력을 리디렉션해야 합니다. 또한 grep을 하나의 명령으로 결합했습니다. 이는 "지금까지의 모든 일치 항목을 잊어버림"을 의미하는 \K
PCRE 기능( 에 의해 활성화됨)입니다 . 일치하는 부분만 인쇄하는 것과 함께 사용하면 매우 유용합니다 -P
.-o
위의 코드는 우아하지 않으며 많은 프로세스로 CPU에 스팸을 보내게 되지만 빠른 확인에는 충분합니다.