Làm thế nào tôi có thể tạo một vòng lặp vô hạn giết chết một quá trình nếu tìm thấy thứ gì đó trong dmesg?


8

Tôi cần tạo một whilevòng lặp mà nếu dmesgtrả về một số / bất kỳ giá trị nào, thì nó sẽ giết một quy trình xác định.

Đây là những gì tôi có.

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

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

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

else
    break
    fi
    done

Tôi không biết thay vì ! -ztôi nên làm[ test -n "$BUG" ]

Tôi nghĩ với -n nó nói điều gì đó về việc mong đợi một nhị phân.

Tôi không biết liệu kịch bản có hoạt động hay không vì khóa BUG tạm dừng mọi quy trình, nhưng vẫn còn một vài dòng nữa dmesgcho đến khi máy tính hoàn toàn bị hỏng - có lẽ tôi có thể bắt kịp và giết tiến trình.


2
Bạn lấy toàn bộ dmesg, do đó, một lần xuất hiện chuỗi tìm kiếm xảy ra, bạn sẽ không thấy nó mỗi lần, và do đó killall ở mỗi vòng lặp! (Ngoài những điều khác mà @ l0b0 đã đề cập, chẳng hạn như thiếu ngủ / nhịp độ, v.v.)
Olivier Dulac

Câu trả lời:


12

Một số vấn đề:

  • Bạn đang chạy cái này trong một vòng lặp bận rộn, việc này sẽ tiêu tốn càng nhiều tài nguyên càng tốt. Đây là một ví dụ trong đó sleeping có thể được chứng minh là hợp lý.
  • Tuy nhiên, các phiên bản gần đây dmesgcó cờ theo dõi đầu ra , vì vậy bạn có thể viết lại toàn bộ nội dung dưới dạng (chưa được kiểm tra)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
  • Mã phải được thụt lề để có thể đọc được.
  • Nó thực sự kỳ lạ, nhưng [cũng giống như test- thấy help [.

1
Ý của bạn là thêm vào -qđể grep -q 'searchstringthoát ra khỏi dmesg --followvà do đó để cho dòng tiếp theo được tiếp cận ngay khi nó thấy một lần xuất hiện của chuỗi tìm kiếm? Không có nó, vòng lặp của bạn sẽ không đến được vòng lặp killall hay vòng lặp?
Olivier Dulac

1
Và ngay cả với -q, tôi sợ bạn sẽ giết rất nhiều, nếu dmesg --follow hiển thị một vài dòng bối cảnh dmesg (và do đó cho thấy (các) sự xuất hiện trước đó), do đó tôi đã đề xuất một câu trả lời như một biến thể.
Olivier Dulac

@OlivierDulac Vấn đề sau nên được quan tâm với tail.
l0b0

Không gì tail --lines=0làm gì? Tôi biết ý nghĩa của nó đối với bất kỳ giá trị nào khác.
Joe

1
@Joe Đó là trong trang man - với --follownó theo sau (nghĩa là in) chỉ các dòng đến sau khi lệnh bắt đầu.
l0b0

9

Một biến thể của câu trả lời của @ 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.,"
        }'

Điều này hãy để awk thực hiện vòng lặp, có một số lợi thế:

  • nó sẽ hoạt động cho đến khi quá trình đó chết.
  • Nó cũng không gọi nhiều hơn 1 killalllần xuất hiện của chuỗi tìm kiếm "BUG: khóa máy", điều này cải thiện câu trả lời khác.

Để kiểm tra: Bạn có thể đặt đoạn mã này vào tập lệnh có tên thescriptvà thực hiện nohup thescript &, để nó thescripttiếp tục chạy ngay cả sau khi bạn thoát phiên.

Một khi bạn hài lòng, nó hoạt động, giết nó, và sau đó bạn có thể (thay vì chạy nó mỗi lần trong một cái vỏ nohup), biến nó thành một daemon scriptcái mà bạn có thể đã bắt đầu trong runlevel hiện tại của mình.

tức là: sử dụng tập lệnh khác làm mô hình (bạn cần có ít nhất các phần bắt đầu, dừng và trạng thái), bạn có thể sửa đổi thescriptmột cách thích hợp và sau đó đặt nó vào trong /etc/rc.d/init.dvà có một liên kết tượng trưng đến nó được đặt tên Sxxthescripttheo (các) thích hợp /etc/rc.d/rcN, Nlà một số cho runlevel bình thường của bạn (xem các dòng trên cùng who -ađể biết mức độ chạy hiện tại). Và cũng có các Kxxthescriptliên kết thích hợp , trong mọi (hoặc gần như mọi) runlevels, để script được giết một cách thích hợp khi chuyển runlevels.

Hoặc thực hiện "những điều thích hợp" để chạy / dừng thông qua systemd hoặc bất kỳ hệ thống tương đương nào mà bản phân phối của bạn sử dụng.


@Nobody: Tôi rất vui. Đừng quên "chấp nhận" (dấu kiểm màu xanh lá cây) cho dù câu trả lời nào có vẻ tốt nhất theo quan điểm của bạn, trừ khi bạn cảm thấy cần phải mở để cho phép câu trả lời tiếp theo (hoặc sửa đổi câu trả lời hiện tại).
Olivier Dulac

cả hai câu trả lời đều mong muốn tôi có thể chọn cả hai.
Không ai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.