Я ничего не знаю -на полке -, но функция-оболочка могла бы справиться с этой задачей. Я реализовал один в bash, используя ассоциативный массив :
.declare -A _throttled=()
throttle() {
if [ "$#" -lt 2 ]
then
printf '%s\n' "Usage: throttle timeout command [arg... ]" >&2
return 1
fi
local t=$1
shift
if [ -n "${_throttled["$1"]}" ]
then
if [ "$(date +%s)" -ge "${_throttled["$1"]}" ]
then
"$@" && _throttled["$1"]=$((t + $(date +%s)))
else
: printf '%s\n' "Timeout for: $1 has not yet been reached" >&2
fi
else
"$@" && _throttled["$1"]=$((t + $(date +%s)))
fi
}
Основная логика такова: :если команда имеет запись в массиве _throttle
, сверить текущее время со значением массива; если время ожидания истекло, запустите команду и --, если команда выполнена успешно, --установите новое значение времени ожидания. Если время ожидания еще не истекло, (не выводить )информативное сообщение. Если, с другой стороны, у команды (еще нет )записи в массиве, запустите команду и --, если команда выполнена успешно --, установите новое значение времени ожидания.
Функция-оболочка не различает команды на основе каких-либо аргументов, поэтому throttle 30 ls
для нее то же самое, что и throttle 30 ls /tmp
. Это легко изменить, заменив ссылки на массивы и присваивания "$1"
на "$@"
.
Также обратите внимание, что я исключил --
из синтаксиса вашего примера.
Также обратите внимание, что разрешение ограничено секундами -.
Если у вас bash версии 4.2 или более поздней, вы можете сохранить вызов внешней команды date
, используя вместо этого встроенную функцию printf
-:
...
_throttled["$1"]=$((t + $(printf '%(%s)T\n' -1)))
...
... где мы запрашиваем время, отформатированное в секундах (%s)
явно текущего времени(-1
).
Или в bash
5.0 или выше:
_throttled["$1"]=$((t + EPOCHSECONDS))
После долгих размышлений я пришел к выводу, что невозможно перезапустить nordvpn с помощью скриптов в /usr/lib/systemd/system -sleep/ .
Я довольствовался тем, что использовал этот сценарий для остановки nordvpn в спящем режиме, и мне нужно не забывать повторно -запускать его вручную при возобновлении работы. Поскольку я использую sway(1 ), горячая клавиша экономит немного времени при наборе текста.
Вот модифицированный скрипт:
#!/bin/sh
if [ "${1}" == "pre" ]; then
# before suspend
pgrep nordvpnd &> /dev/null && nordvpn status |grep -q 'Status: Connected' && {
# This will run as root, so root needs to have been initialised by
# 'nordvpn login' at some time in the past.
nordvpn disconnect
}
elif [ "${1}" == "post" ]; then
# after resume
:
fi