Matikan proses jika diam selama beberapa waktu

9

Saya memiliki utilitas yang memiliki kebiasaan buruk untuk pergi diam dan tinggal di sana, saya sudah tahu berapa lama dalam proses ini melakukan ini sehingga saya gunakan timeoutuntuk melawan ini, tetapi kadang-kadang melakukannya sebelum waktu itu. Apakah ada alat yang mirip dengan timeoutyang akan mematikan proses jika berhenti mengarahkan keluaran ke stdout?

Benjojo
sumber

Jawaban:

8

Dengan zsh, Anda bisa melakukan:

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

Idenya adalah menggunakan -topsi sysreaduntuk membaca dari your-commandoutput dengan batas waktu.

Perhatikan bahwa itu membuat your-commandkeluaran menjadi pipa. Mungkin itu your-commandmulai buffering output ketika tidak pergi ke terminal, dalam hal ini Anda mungkin menemukan itu tidak mengeluarkan apa-apa dalam beberapa saat, tetapi hanya karena buffering itu, bukan karena itu tergantung entah bagaimana.

Anda dapat mengatasinya dengan menggunakan stdbuf -oL your-commanduntuk mengembalikan garis-buffering (jika perintah Anda menggunakan stdio) atau menggunakan zptybukan coprocuntuk memalsukan output terminal.

Dengan bash, Anda harus mengandalkan dddan GNU timeoutjika tersedia:

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

Alih-alih coproc, Anda juga bisa menggunakan subtitusi proses:

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)

(itu tidak akan berhasil zshatau ksh93karena $!tidak mengandung pid di your-commandsana).

Stéphane Chazelas
sumber
1
Hai! Terima kasih, apakah mungkin Anda bisa berkomentar sehingga saya bisa mengerti apa yang sedang dilakukan?
Benjojo
0

Saya akan mengarahkan STDOUT ke file dan kemudian menggunakan pengujian cap waktu monit untuk memulai kembali proses jika file mtime lebih besar dari ambang.

Mark Wagner
sumber