Щодо рішення https://stackoverflow.com/a/41613532/1223975, яке Олександр Міллс повторно відмітив, Timeout in Seconds
Darwin
- це рішення для ОС, схожої на UNIX, яка не має GNU tail
. Це не конкретно Darwin
, але, залежно від віку операційної системи, схожої на UNIX, запропонований командний рядок є складнішим, ніж необхідно, і може вийти з ладу:
lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)
Принаймні на одному старому UNIX lsof
аргумент +r 1m%s
не вдається (навіть для суперпользователя):
lsof: can't read kernel name list.
Це m%s
специфікація формату виводу. Простіший постпроцесор цього не вимагає. Наприклад, наступна команда чекає на PID 5959 до п'яти секунд:
lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'
У цьому прикладі, якщо PID 5959 закінчується за власним бажанням до того, як минуть п'ять секунд, ${?}
це 0
. Якщо не ${?}
повертається 1
через п’ять секунд.
Вона також може бути варто прямо зазначити , що в +r 1
, то 1
є інтервал опитування (в секундах), так що він може бути змінений відповідно до ситуації.