Komut satırı komutuna verilen bu yanıt , belirli bir süre sonra bir komutu otomatik olarak öldürmek
bash komut satırından uzun süren bir komutun zaman aşımına uğraması için 1 satırlık bir yöntem önerir:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Ancak, belirli bir "uzun süren" komutun zaman aşımından önce bitmesi mümkündür. (Buna "tipik olarak uzun süren ama bazen hızlı" bir komut veya eğlence için tlrbsf diyelim .)
Bu şık 1 katlı yaklaşımın birkaç sorunu var. Birincisi, sleep
koşullu değildir, böylece dizinin bitmesi için geçen süre için istenmeyen bir alt sınır belirler. Tlrbsf komutu 2 saniyede bittiğinde uyku için 30s veya 2m hatta 5m düşünün - çok istenmeyen. İkincisi, kill
koşulsuzdur, bu nedenle bu dizi çalışmayan bir süreci öldürmeye ve bu konuda sızlanmaya çalışacaktır.
Yani...
Genellikle uzun çalışan ama bazen hızlı ( "tlrbsf" ) komutunu zaman aşımına uğratmanın bir yolu var mı
- bir bash uygulaması var (diğer soru zaten Perl ve C cevaplarına sahip)
- ikisinin başında sona erecek : tlrbsf programın sonlandırılması veya geçen zaman aşımı
- mevcut olmayan / çalışmayan süreçleri öldürmeyecek (veya isteğe bağlı olarak: kötü bir öldürmeden şikayet etmeyecek )
- 1 astar olmak zorunda değil
- Cygwin veya Linux altında çalışabilir
... ve bonus puanlar için, tlrbsf komutunu ön planda ve arka planda herhangi bir 'uyku' veya ekstra işlemi çalıştırır, böylece tlrbsf komutunun stdin / stdout / stderr'i , sanki eskisi gibi yönlendirilebilir doğrudan koşmak?
Öyleyse, lütfen kodunuzu paylaşın. Değilse, lütfen nedenini açıklayın.
Bir süredir yukarıda bahsi geçen örneği hacklemek için harcadım ama bash becerilerimin sınırına ulaşıyorum.
timeout
yardımcı programını kullanmamak için herhangi bir neden var mı?
timeout
Harika! birden fazla komutla bile kullanabilirsiniz (çok satırlı komut dosyası): stackoverflow.com/a/61888916/658497