Belirli bir süre sessiz kalırsa bir işlemi öldür


9

Sessiz kalmak ve orada kalmak gibi kötü bir alışkanlığı olan bir yardımcı programım var, bu sürece ne kadar sürdüğünü biliyorum, bu yüzden bununla timeoutmücadele etmek için kullanıyorum , ama bazen o zamandan önce yapıyor. timeoutÇıkışı stdout'a yönlendirmeyi durdurursa, süreci öldürecek buna benzer bir araç var mı ?

Yanıtlar:


8

İle zshşunları yapabilirsiniz:

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

Fikir , çıktıdan zaman aşımı ile okuma -tseçeneğini kullanmaktır .sysreadyour-command

your-commandÇıkışını bir boru haline getirdiğine dikkat edin . your-commandBir terminale gitmediğinde çıkışını tamponlamaya başlayabilir , bu durumda bir süre hiçbir şey vermediğini fark edebilirsiniz, ancak sadece bu tamponlama nedeniyle, bir şekilde asılı olduğu için değil .

Sen kullanarak bu geçici bir çözüm olabilir stdbuf -oL your-command(your-komutun kullandığı stdio ise) hat-arabelleğe geri yüklemek veya kullanmak zptyyerine coprocbir terminal çıkış sahte.

İle bash, güvenmeniz ddve timeoutvarsa GNU :

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

Bunun yerine, coprocişlem ikamesini de kullanabilirsiniz:

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)

(o olmaz iş zshya ksh93çünkü $!pid içermiyor your-commandorada).


1
Selam! Teşekkürler, bunun ne yaptığını anlayabilmem için yorum yapabilir misiniz?
Benjojo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.