Jawaban untuk perintah baris perintah ini untuk secara otomatis membunuh perintah setelah waktu tertentu
mengusulkan metode 1-baris untuk menghentikan perintah yang sudah berjalan lama dari baris perintah bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Tapi mungkin saja perintah "jangka panjang" yang diberikan bisa selesai lebih awal dari batas waktu. (Sebut saja "perintah yang biasanya berjalan lama tapi kadang-kadang cepat", atau tlrbsf untuk bersenang-senang.)
Jadi pendekatan 1-liner yang bagus ini memiliki beberapa masalah. Pertama, sleep
tidak bersyarat, sehingga menetapkan batas bawah yang tidak diinginkan pada waktu yang dibutuhkan untuk menyelesaikan urutan. Pertimbangkan 30s atau 2m atau bahkan 5m untuk tidur, ketika perintah tlrbsf selesai dalam 2 detik - sangat tidak diinginkan. Kedua, kill
tidak bersyarat, sehingga urutan ini akan mencoba untuk membunuh proses yang tidak berjalan dan mengeluh tentang hal itu.
Begitu...
Apakah ada cara untuk menghentikan perintah ( "tlrbsf" ) yang biasanya berjalan lama tapi kadang-kadang cepat
- memiliki implementasi bash (pertanyaan lain sudah memiliki jawaban Perl dan C)
- akan berakhir di bagian paling awal dari keduanya: penghentian program tlrbsf , atau batas waktu telah berlalu
- tidak akan membunuh proses yang tidak ada / tidak berjalan (atau, opsional: tidak akan mengeluh tentang pembunuhan yang buruk)
- tidak harus menjadi 1-liner
- dapat berjalan di bawah Cygwin atau Linux
... dan, untuk poin bonus, jalankan perintah tlrbsf di latar depan dan 'sleep' atau proses tambahan apa pun di latar belakang, sehingga stdin / stdout / stderr dari perintah tlrbsf dapat dialihkan, sama seperti jika telah lari langsung?
Jika demikian, silakan bagikan kode Anda. Jika tidak, tolong jelaskan mengapa.
Saya telah menghabiskan beberapa waktu mencoba meretas contoh yang disebutkan di atas tetapi saya mencapai batas kemampuan bash saya.
timeout
utilitas gnu ?
timeout
bagus! Anda bahkan dapat menggunakan beberapa perintah (skrip multi-baris): stackoverflow.com/a/61888916/658497