Запуск функции bash каждые x минут (ов)

Теперь, когда Q3 был дан ответ (правильно, на мой взгляд: BASH_COMMAND полезен в ловушках и почти нигде), давайте дадим Q1 и Q2 выстрел.

Ответ на Q1: правильность вашего предположения неразрешима. Истина ни о точках пули не может быть установлена, поскольку они спрашивают о неуказанном поведении. По его спецификации значение BASH_COMMAND устанавливается на текст команды на время выполнения этой команды. Спецификация не указывает, каково ее значение в любой другой ситуации, то есть когда никакая команда не выполняется. Он может иметь любое значение или вообще ничего.

Ответ на Q2 «Если нет, как еще можно объяснить поведение в приведенной выше последовательности команд?» затем следует логически (если несколько педантично): это объясняется тем, что значение BASH_COMMAND не определено. Поскольку это значение не определено, оно может иметь любое значение, которое точно соответствует последовательности.

Postscript

Есть один момент, когда я думаю, что вы действительно попадаете в мягкое пятно в спецификации. Это где вы говорите:

Даже когда я делаю MYVARIABLE = $ BASH_COMMAND прямо в начале моей $ PROMPT_COMMAND, тогда MYVARIABLE содержит строку MYVARIABLE = $ BASH_COMMAND, потому что назначение тоже является командой.

Как я прочитал страницу bash man, бит в курсиве не соответствует действительности. В разделе SIMPLE COMMAND EXPANSION объясняется, как сначала выделены назначения переменных в командной строке, а затем

Даже когда я делаю MYVARIABLE = $ BASH_COMMAND прямо в начале моего $ PROMPT_COMMAND, тогда MYVARIABLE содержит строку MYVARIABLE = $ BASH_COMMAND, потому что назначение тоже является командой.

Если имя команды не было [другими словами, были только назначения переменных), назначения переменных влияют на текущий shell.

Это говорит мне о том, что назначения переменных не являются командами (и поэтому освобождаются от появления в BASH_COMMAND), как на других языках программирования. Это также объясняет, почему в выводе set, set нет строки BASH_COMMAND=set, по существу являющейся синтаксическим «маркером» для присваивания переменной.

Если есть имя команды слева после расширения, выполнение продолжается, как описано ниже. В противном случае команда выйдет.

OTOH, в последнем абзаце этого раздела говорится

1
задан 17 December 2017 в 15:24

3 ответа

Кажется, вам запрещено использовать cron. В этом случае вы можете использовать бесконечный цикл, который вызывает эту функцию в фоновом режиме, а затем спит для x минут:

while true; do speedtest & sleep 60; done

Просто убедитесь, что вы спите достаточно долго, чтобы текущий speedtest вызов завершается до того, как сон закончится, чтобы избежать параллельного выполнения нескольких экземпляров процесса.

Если вы не хотите, чтобы терминал был открыт с этим запуском, вы можете сделать это в файле screen или tmux сеанс.

2
ответ дан 22 May 2018 в 16:57
  • 1
    Я использовал это прежде, чем проблема заключается в том, что он подсчитывает время задержки + время, необходимое для его выполнения. Мне нужно, чтобы он выполнялся ровно каждые x минут. – Cyber_Star 17 December 2017 в 15:14
  • 2
    @Cyber_Star Я вижу. Я обновил свой пост соответственно. – janos 17 December 2017 в 15:19

Кажется, вам запрещено использовать cron. В этом случае вы можете использовать бесконечный цикл, который вызывает эту функцию в фоновом режиме, а затем спит для x минут:

while true; do speedtest & sleep 60; done

Просто убедитесь, что вы спите достаточно долго, чтобы текущий speedtest вызов завершается до того, как сон закончится, чтобы избежать параллельного выполнения нескольких экземпляров процесса.

Если вы не хотите, чтобы терминал был открыт с этим запуском, вы можете сделать это в файле screen или tmux сеанс.

2
ответ дан 18 July 2018 в 01:02

Кажется, вам запрещено использовать cron. В этом случае вы можете использовать бесконечный цикл, который вызывает эту функцию в фоновом режиме, а затем спит для x минут:

while true; do speedtest & sleep 60; done

Просто убедитесь, что вы спите достаточно долго, чтобы текущий speedtest вызов завершается до того, как сон закончится, чтобы избежать параллельного выполнения нескольких экземпляров процесса.

Если вы не хотите, чтобы терминал был открыт с этим запуском, вы можете сделать это в файле screen или tmux сеанс.

2
ответ дан 24 July 2018 в 17:19

Другие вопросы по тегам:

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