Чисто bash
вбудований, без стрижнів
Я виявив, що це рішення працює, bash
спираючись на вбудовану команду без виклику зовнішнього виконуваного файлу. Він працює в системі, де з часом навіть не були встановлені основні системи [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Пояснення : як зазвичай при використанні команди у фоновому режимі з &
його PID зберігається у внутрішній змінної $!
( в даний час в сучасній версії dash
, csh
, bash
, tcsh
, zsh
...).
Що насправді має різницю серед оболонок - це наявність вбудованої команди read
[ 2 ] та опції -t
. У першій версії, якщо користувач не завершить рядок введення до вказаної кількості секунд, інструкція буде припинена та буде сформовано код повернення помилки.
-t TIMEOUT Причина зчитування для очікування та виходу з ладу, якщо повна лінія вводу не буде прочитана протягом TIMEOUT секунд.
Друга версія працює як перша, але ви можете перервати час очікування вбивства просто натиснувши enter.
Дійсно, або оператор ||
виконує kill
оператор, лише якщо read
команда закінчується кодом повернення, відмінним від нуля, як, коли час закінчення закінчився. Якщо натиснути enterдо цього моменту, він поверне 0, і це не вб'є вашу попередню команду.
Рішення Coreutils [ 1 ]
Коли Coreutils присутні у вашій системі , і ви не потребуєте , щоб заощадити час і ресурси , щоб викликати зовнішню програму, timeout
і sleep
та є досконалими способами , щоб досягти своєї мети.
timeout
Використання timeout
прямолінійно.
Зрештою, ви можете розглянути можливість використання також -k
опції для надсилання додаткового сигналу вбивства, якщо перший не вдасться.
timeout 5m YourCommand # 3rd version
sleep
З sleep
вами можна використати свою фантазію або взяти натхнення [ 3 ] . Зауважте, що ви можете залишити свою команду у фоновому режимі чи на передньому плані (наприклад, top
зазвичай це має бути на передньому плані).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
Пояснення
- У 4-й версії ви виконуєте у фоновому режимі,
YourCommand
а потім оболонку sleep
- 5 хвилин. Після завершення останнього фонового процесу ( $!
) буде вбито. Ви зупиняєте свою оболонку.
-
У 5-й версії замість цього ви виконуєте у фоновому режимі,
YourCommand
і ви негайно зберігаєте цей PID у змінній $pid
. Тоді ви виконуєте у фоновому режимі дрімоту в 5 хвилин і її послідовну команду, яка знищить збережений PID. Оскільки ви надіслали цю групу команд у фоновому режимі, ви не зупиняєте свою оболонку. Потрібно зберігати PID у змінній, оскільки значення $!
може бути оновлено можливим виконанням іншої програми у фоновому режимі. Простими словами, ви уникаєте ризику вбити неправильний процес або взагалі немає процесу.
- У 6-й версії вона називається новою оболонкою, яка самогубства через 5 хвилин
$$
, після чого виконується ваша команда, що залишається на передньому плані.
- У 7-й версії він викликається підзаголовком,
()
який зберігає свій PID у змінній ( cmdpid
) і вбиває себе за допомогою іншої підзарядки, надісланої у фоновому виконанні, а потім запускає YourCommand на передньому плані.
Звичайно, у кожній версії ви можете надсилати потрібний сигнал вбивства, починаючи від типового до крайнього kill -9
, використовуватися лише тоді, коли це дійсно потрібно.
Список літератури
- [ 1 ] Кореутіли
- [ 2 ] Посібник для початківців Bash
- [ 3 ] BashFAQ