Saya perlu membuat while
loop bahwa jika dmesg
mengembalikan beberapa nilai, maka itu harus membunuh proses yang ditentukan.
Inilah yang saya miliki.
#!/bin/bash
while [ 1 ];
do
BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)
if [ ! -z "$BUG" ]; then
killall someprocessname
else
break
fi
done
Saya tidak tahu apakah ! -z
saya harus melakukannya[ test -n "$BUG" ]
Saya pikir dengan -n dikatakan sesuatu tentang mengharapkan biner.
Saya tidak tahu apakah skrip akan bekerja karena penguncian BUG menghentikan setiap proses, tetapi masih ada beberapa baris lagi dmesg
sampai komputer benar-benar borked - mungkin saya dapat mengejar ketinggalan dan mematikan prosesnya.
Jawaban:
Beberapa isu:
sleep
ing bisa dibenarkan.Namun, versi terbaru
dmesg
memiliki bendera untuk mengikuti output , sehingga Anda dapat menulis ulang semuanya sebagai (belum diuji)[
sama dengantest
- lihathelp [
.sumber
-q
sehinggagrep -q 'searchstring
keluar daridmesg --follow
dan dengan demikian membiarkan baris berikutnya tercapai segera setelah ia melihat satu kemunculan string pencarian? Tanpanya loop Anda tidak akan mencapai killall atau loop?tail
.tail --lines=0
harus dilakukan Saya tahu apa artinya untuk nilai lainnya.--follow
itu mengikuti (yaitu, mencetak) hanya baris yang tiba setelah perintah dimulai.Varian dari jawaban @ l0b0:
Ini mari kita lakukan perulangan, yang memiliki beberapa keunggulan:
killall
per kejadian pencarian "BUG: workqueue lockup", yang meningkatkan jawaban yang lain.Untuk menguji: Anda bisa memasukkan ini ke dalam skrip bernama
thescript
, dan lakukannohup thescript &
, sehinggathescript
akan tetap berjalan bahkan setelah Anda keluar dari sesi Anda.Setelah Anda puas itu berhasil, bunuh saja, dan kemudian Anda dapat (alih-alih menjalankannya setiap kali dengan shell
nohup
) mengubahnya menjadidaemon script
yang kemudian dapat Anda mulai di runlevel Anda saat ini.yaitu: menggunakan skrip lain sebagai model (Anda harus memiliki setidaknya bagian awal, berhenti dan status), Anda dapat memodifikasi dengan
thescript
tepat dan kemudian menempatkannya di dalam/etc/rc.d/init.d
, dan memiliki symlink untuk itu bernama diSxxthescript
bawah yang sesuai/etc/rc.d/rcN
,N
menjadi nomor untuk runlevel normal Anda (lihat baris ataswho -a
untuk mengetahui level run saat ini). Dan memilikiKxxthescript
symlink yang tepat juga, di setiap (atau hampir setiap) runlevel, sehingga skrip terbunuh secara tepat ketika berpindah runlevel.Atau lakukan "hal-hal yang sesuai" agar dijalankan / dihentikan melalui systemd atau sistem setara yang digunakan distribusi Anda.
sumber