Ця відповідь на команду командного рядка для автоматичного вбити команду по закінченні певного періоду часу
пропонує 1-рядковий метод для вимкнення тривалої команди з командного рядка bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Але можливо, що дана команда "тривалого виконання" може закінчитися раніше, ніж час очікування. (Назвемо це командою "типово довгого, але іноді швидкої", або tlrbsf для задоволення.)
Тож у цього витонченого 1-лайнерного підходу є кілька проблем. По-перше, sleep
це не умовно, так що встановлюється небажана нижня межа часу, необхідного для завершення послідовності. Вважайте, що для сну 30, 2 або навіть 5 м, коли команда tlrbsf закінчується за 2 секунди - вкрай небажано. По-друге, kill
умова є безумовною, тому ця послідовність буде намагатися вбити не запущений процес і скигнути на нього.
Так...
Чи є спосіб вимкнути типово довгу працюючу, але іноді швидку ( "tlrbsf" ) команду, яка
- має реалізацію bash (на інше питання вже є відповіді Perl та C)
- завершиться на попередньому з двох: завершення програми tlrbsf або минув тайм-аут
- не вбиває неіснуючі / не запущені процеси (або, необов'язково: не поскаржиться на погане вбивство)
- не повинно бути 1-лайнером
- може працювати під Cygwin або Linux
... і, за бонусними очками, виконує команду tlrbsf на передньому плані та будь-який "сон" чи додатковий процес у фоновому режимі, таким чином, що stdin / stdout / stderr команди tlrbsf можна перенаправляти так само, як якщо б це було бігати безпосередньо?
Якщо так, будь ласка, поділіться своїм кодом. Якщо ні, поясніть, будь ласка, чому.
Я витратив деякий час, намагаючись зламати згаданий приклад, але я потрапляю на межу моїх баш-навичок.
timeout
утиліту gnu ?
timeout
це здорово! ви навіть можете використовувати декілька команд (багаторядковий сценарій): stackoverflow.com/a/61888916/658497