Bagaimana saya bisa membuat loop tak terbatas yang membunuh proses jika ada sesuatu yang ditemukan di dmesg?

8

Saya perlu membuat whileloop bahwa jika dmesgmengembalikan 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 ! -zsaya 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 dmesgsampai komputer benar-benar borked - mungkin saya dapat mengejar ketinggalan dan mematikan prosesnya.

Tak seorangpun
sumber
2
Anda mengambil seluruh dmesg, jadi begitu satu kemunculan string yang dicari terjadi, Anda tidak akan melihatnya setiap kali, dan karenanya mematikan semua pada setiap loop! (Selain hal-hal lain @ l0b0 disebutkan seperti kurang tidur / mondar-mandir, dll)
Olivier Dulac

Jawaban:

12

Beberapa isu:

  • Anda menjalankan ini dalam loop sibuk, yang akan menghabiskan sumber daya sebanyak mungkin. Ini adalah salah satu contoh di mana sleeping bisa dibenarkan.
  • Namun, versi terbaru dmesgmemiliki bendera untuk mengikuti output , sehingga Anda dapat menulis ulang semuanya sebagai (belum diuji)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • Kode harus diindentasi agar dapat dibaca.
  • Ini benar-benar aneh, tetapi [sama dengan test- lihat help [.
l0b0
sumber
1
Apakah Anda bermaksud menambahkan -qsehingga grep -q 'searchstringkeluar dari dmesg --followdan dengan demikian membiarkan baris berikutnya tercapai segera setelah ia melihat satu kemunculan string pencarian? Tanpanya loop Anda tidak akan mencapai killall atau loop?
Olivier Dulac
1
Dan bahkan dengan -q, saya khawatir Anda akan membunuh banyak, jika dmesg --follow menunjukkan beberapa baris konteks dmesg (dan dengan demikian menunjukkan kejadian sebelumnya), maka aanswer yang saya usulkan sebagai varian.
Olivier Dulac
@OlivierDulac Masalah terakhir harus diurus dengan tail.
l0b0
Apa yang tail --lines=0harus dilakukan Saya tahu apa artinya untuk nilai lainnya.
Joe
1
@Joe Ada di halaman manual - dengan --followitu mengikuti (yaitu, mencetak) hanya baris yang tiba setelah perintah dimulai.
l0b0
9

Varian dari jawaban @ 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.,"
        }'

Ini mari kita lakukan perulangan, yang memiliki beberapa keunggulan:

  • itu akan bekerja sampai proses itu mati.
  • Itu juga tidak memanggil lebih dari 1 killallper kejadian pencarian "BUG: workqueue lockup", yang meningkatkan jawaban yang lain.

Untuk menguji: Anda bisa memasukkan ini ke dalam skrip bernama thescript, dan lakukan nohup thescript &, sehingga thescriptakan 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 menjadi daemon scriptyang 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 thescripttepat dan kemudian menempatkannya di dalam /etc/rc.d/init.d, dan memiliki symlink untuk itu bernama di Sxxthescriptbawah yang sesuai /etc/rc.d/rcN, Nmenjadi nomor untuk runlevel normal Anda (lihat baris atas who -auntuk mengetahui level run saat ini). Dan memiliki Kxxthescriptsymlink 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.

Olivier Dulac
sumber
@Nobody: Saya senang. Jangan lupa untuk "menerima" (tanda centang hijau), jawaban mana yang paling baik menurut Anda, kecuali Anda merasa perlu tetap terbuka untuk memperbolehkan jawaban lebih lanjut (atau modifikasi dari jawaban saat ini).
Olivier Dulac
kedua jawaban itu benar berharap saya bisa memilih keduanya.
Tidak seorang pun