Linux, nordvpn и режим сна/возобновления

Я ничего не знаю -на полке -, но функция-оболочка могла бы справиться с этой задачей. Я реализовал один в 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).

Или в bash5.0 или выше:

_throttled["$1"]=$((t + EPOCHSECONDS))
2
10.07.2020, 01:57
1 ответ

После долгих размышлений я пришел к выводу, что невозможно перезапустить 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
0
18.03.2021, 23:20

Теги

Похожие вопросы