Linux bash sleep, если команда выполняется быстро - PullRequest
0 голосов
/ 15 мая 2019

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

Если вам интересно, почему оно должно запускаться сторонним фоновым заданием демона (работающим каждые 10 секунд).

Что у меня есть: sleep 10; my_command.sh но это добавит 10 секунд к общему выполнению, поэтому, если самой команде потребуется 10 секунд или более, она все равно добавит еще 10 секунд. Можно ли спать, только если команда занимает менее 10 секунд?

EDIT: Я также хочу, чтобы код завершения my_command.sh возвращался по окончании выполнения. Таким образом, вся команда, включая sleep, должна возвращать тот же код завершения, что и my_command.sh.

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

С bash:

#!/bin/bash
SECONDS=0
# place your code here
rest=$((10-$SECONDS))
[[ $rest -gt 0 ]] && sleep $rest

Обновление: Использование функции и сохранение кода возврата в переменной:

#!/bin/bash

foo() {
  local SECONDS=0
  local returncode

  # place your code here
  returncode=$?

  rest=$((10-$SECONDS))
  [[ $rest -gt 0 ]] && sleep $rest

  return $returncode
}

foo
echo $?
4 голосов
/ 15 мая 2019

Вы можете запустить sleep 10 в фоновом режиме и wait, чтобы завершить его после завершения my_command.sh.

sleep 10 & my_command.sh; wait

Если есть другие фоновые задания, они тоже будут их ждать.В этом случае вы можете либо запустить его в subshell , например:

( sleep 10 & my_command.sh; wait )

, либо сохранить PID sleep 10 в переменной и ждать его, поэтому my_command.sh будетзапускаться в текущей среде исполнения , например:

sleep 10 & pid=$!; my_command.sh; wait "$pid"
...