일부/어떤 값이 반환 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
몇 가지 문제:
- 가능한 한 많은 리소스를 소비하는 바쁜 루프에서 실행하고 있습니다. 이는
sleep
ing이 합리적이라고 상상할 수 있는 예 입니다 . 하지만,최신 버전에는
dmesg
출력을 따르는 플래그가 있습니다., 그래서 전체 내용을 (테스트되지 않음)로 다시 작성할 수 있습니다.while true do dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup' killall someprocessname done
- 코드를 읽을 수 있도록 들여쓰기해야 합니다.
- 이건 정말 이상하지만,
[
- 보세요.test
help [
답변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/rcN
N
who -a
Kxxthescript
또는 systemd 또는 배포판에서 사용하는 것과 동등한 것을 통해 실행/중지하기 위해 "적절한 일"을 수행하십시오.