dmesg에서 무언가가 발견되면 프로세스를 종료하기 위해 무한 루프를 어떻게 만들 수 있습니까?

dmesg에서 무언가가 발견되면 프로세스를 종료하기 위해 무한 루프를 어떻게 만들 수 있습니까?

일부/어떤 값이 반환 while되면 특정 프로세스를 종료해야 하는 루프를 만들어야 합니다 .dmesg

이것이 내가 가진 것입니다.

#!/bin/bash
while [ 1 ];
do

BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)

    if [ ! -z "$BUG" ]; then
   killall someprocessname

else
    break
    fi
    done

! -z이걸 해야할지 모르겠어[ test -n "$BUG" ]

-n은 바이너리를 기대한다는 뜻이라고 생각합니다.

BUG 잠금이 모든 프로세스를 중지시키기 때문에 이 스크립트가 작동할지는 모르겠지만 컴퓨터가 완전히 충돌하기 전에 아직 몇 줄이 남아 있습니다. dmesg어쩌면 프로세스를 따라잡고 종료할 수 있을 것입니다.

답변1

몇 가지 문제:

  • 가능한 한 많은 리소스를 소비하는 바쁜 루프에서 실행하고 있습니다. 이는 sleeping이 합리적이라고 상상할 수 있는 예 입니다 .
  • 하지만,최신 버전에는 dmesg출력을 따르는 플래그가 있습니다., 그래서 전체 내용을 (테스트되지 않음)로 다시 작성할 수 있습니다.

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • 코드를 읽을 수 있도록 들여쓰기해야 합니다.
  • 이건 정말 이상하지만, [- 보세요.testhelp [

답변2

@l0b0의 답변에 대한 변형:

dmesg --follow | awk '
   /BUG: workqueue lockup/  { system ("killall someprocessname") ; rem="done at each occurrence. You could add further things, like print to a logfile, etc.,"
        }'

이를 통해 awk는 몇 가지 장점이 있는 루프를 수행할 수 있습니다.

  • 프로세스가 종료될 때까지 작동합니다.
  • killall또한 검색 문자열 "BUG: 작업 대기열 잠금"이 나타날 때마다 한 번 이상 호출되지 않으므로 다른 답변이 향상됩니다.

thescript테스트: 이것을 이라는 스크립트 에 넣고 세션을 종료한 후에도 스크립트가 계속 실행되도록 할 수 nohup thescript &있습니다 .thescript

작동하는 것에 만족하면 종료하고 (셸에서 매번 실행하는 대신 ) 현재 실행 수준에서 시작할 수 nohup있는 것으로 변환 할 수 있습니다.daemon script

즉, 다른 스크립트를 모델로 사용하여(적어도 시작, 중지 및 상태 섹션이 있어야 함) thescript적절하게 수정할 수 있는 다음 이를 배치하고 /etc/rc.d/init.d적절한 스크립트 아래에 일반 런레벨 번호로 심볼릭 링크 이름을 지정합니다(참조: 현재 런레벨의 맨 윗줄). 또한 각(또는 거의 모든) 런레벨에는 런레벨을 전환할 때 스크립트를 적절하게 종료하기 위한 적절한 심볼릭 링크도 있습니다.Sxxthescript/etc/rc.d/rcNNwho -aKxxthescript

또는 systemd 또는 배포판에서 사용하는 것과 동등한 것을 통해 실행/중지하기 위해 "적절한 일"을 수행하십시오.

관련 정보