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