Giết một tiến trình nếu nó im lặng trong một khoảng thời gian nhất định


9

Tôi có một tiện ích có thói quen khó chịu là im lặng và ở đó, tôi đã biết quá trình này diễn ra trong bao lâu nên tôi đang sử dụng timeoutđể chống lại điều này, nhưng đôi khi nó làm điều đó trước thời điểm đó. Có một công cụ tương tự timeoutsẽ giết quá trình nếu nó dừng hướng đầu ra đến thiết bị xuất chuẩn?

Câu trả lời:


8

Với zsh, bạn có thể làm:

zmodload zsh/system
coproc your-command
while :; do
  sysread -t 10 -o 1 <&p && continue
  if (( $? == 4 )); then
    echo "Timeout" >&2
    kill $!
  fi
  break
done

Ý tưởng là sử dụng -ttùy chọn sysreadđọc từ your-commandđầu ra với thời gian chờ.

Lưu ý rằng nó làm cho your-commandđầu ra của một đường ống. Có thể là your-commandbắt đầu đệm đầu ra của nó khi nó không đi đến một thiết bị đầu cuối, trong trường hợp đó bạn có thể thấy rằng nó không xuất ra bất cứ thứ gì trong một thời gian, nhưng chỉ vì bộ đệm đó, không phải vì nó bị treo .

Bạn có thể giải quyết vấn đề đó bằng cách sử dụng stdbuf -oL your-commandđể khôi phục bộ đệm dòng (nếu lệnh của bạn sử dụng stdio) hoặc sử dụng zptythay vì coprocgiả mạo đầu ra của thiết bị đầu cuối.

Với bash, bạn phải dựa vào ddvà GNU timeoutnếu có:

coproc your-command
while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done

Thay vì coproc, bạn cũng có thể sử dụng thay thế quá trình:

while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done 3< <(your-command)

(điều đó sẽ không hoạt động trong zshhoặc ksh93bởi vì $!không chứa pid your-commandở đó).


1
Chào! Cảm ơn, có thể bạn có thể nhận xét điều này để tôi có thể hiểu những gì nó đang làm?
Benjojo

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.