Относительно решения 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есть интервал опроса (в секундах), так что он может быть изменен в соответствии с ситуацией.