Сон до определенного времени/даты

Я хочу, чтобы мой сценарий удара спал до определенного времени. Так, я хочу команду как "сон", который не берет интервала, но время окончания и сны до тех пор.

"В" - демон не является решением, поскольку я должен заблокировать под управлением сценарий до определенной даты/времени.

Есть ли такая команда?

74
задан codeforester 28 October 2019 в 05:37
поделиться

7 ответов

Как упомянуто Программистом Преступника, я думаю, что решение состоит в том, чтобы только спать для корректного числа секунд.

, Чтобы сделать это в ударе, сделайте следующее:

current_epoch=$(date +%s)
target_epoch=$(date -d '01/01/2010 12:00' +%s)

sleep_seconds=$(( $target_epoch - $current_epoch ))

sleep $sleep_seconds

Для добавления точности вниз к наносекундам (эффективно больше вокруг миллисекунд) использование, например, этот синтаксис:

current_epoch=$(date +%s.%N)
target_epoch=$(date -d "20:25:00.12345" +%s.%N)

sleep_seconds=$(echo "$target_epoch - $current_epoch"|bc)

sleep $sleep_seconds

Примечание, что macOS / OS X не поддерживает точность ниже секунд, необходимо было бы использовать coreutils от brew вместо этого → см. эти инструкции

84
ответ дан Community 24 November 2019 в 11:56
поделиться

Вы могли, возможно, использовать 'в' отправить сигнал в Ваш сценарий, который находился, ожидая того сигнала.

1
ответ дан Kim Reece 24 November 2019 в 11:56
поделиться

Можно вычислить число секунд между теперь и время пробуждения и использовать существующую команду 'сна'.

1
ответ дан Outlaw Programmer 24 November 2019 в 11:56
поделиться

Можно мешать процессу выполниться, путем отправки ему сигнала SIGSTOP, и затем заставить его продолжать выполняться путем отправки ему сигнала SIGCONT.

, Таким образом, Вы могли остановить свой сценарий отправкой, SIGSTOP:

kill -SIGSTOP <pid>

И затем используют в deamon для пробуждения его путем отправки ему SIGCONT таким же образом.

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

8
ответ дан SpoonMeiser 24 November 2019 в 11:56
поделиться

Используйте sleep, но вычислите время с помощью date. Вы захотите использовать date -d для этого. Например, скажем, Вы хотели ожидать до следующей недели:

expr `date -d "next week" +%s` - `date -d "now" +%s`

Просто замена "следующая неделя" с любой датой Вы хотели бы ожидать, затем присвоили бы это выражение значению и сон для этого много секунд:

startTime=$(date +%s)
endTime=$(date -d "next week" +%s)
timeToWait=$(($endTime- $startTime))
sleep $timeToWait

Все сделанные!

19
ответ дан Steve Schnepp 24 November 2019 в 11:56
поделиться

To follow on SpoonMeiser's answer, here's a specific example:

$cat ./reviveself

#!/bin/bash

# save my process ID
rspid=$$

# schedule my own resuscitation
# /bin/sh seems to dislike the SIGCONT form, so I use CONT
# at can accept specific dates and times as well as relative ones
# you can even do something like "at thursday" which would occur on a 
# multiple of 24 hours rather than the beginning of the day
echo "kill -CONT $rspid"|at now + 2 minutes

# knock myself unconscious
# bash is happy with symbolic signals
kill -SIGSTOP $rspid

# do something to prove I'm alive
date>>reviveself.out
$
6
ответ дан 24 November 2019 в 11:56
поделиться

timeToWait = $ (($ end - $ start))

Помните, что «timeToWait» может быть отрицательным числом! (например, если вы укажете «спать» до «15:57», а теперь «15:58»). Поэтому вы должны проверить это, чтобы избежать странных ошибок в сообщениях:

#!/bin/bash
set -o nounset

### // Sleep until some date/time. 
# // Example: sleepuntil 15:57; kdialog --msgbox "Backup needs to be done."


error() {
  echo "$@" >&2
  exit 1;
}

NAME_PROGRAM=$(basename "$0")

if [[ $# != 1 ]]; then
     error "ERROR: program \"$NAME_PROGRAM\" needs 1 parameter and it has received: $#." 
fi


current=$(date +%s.%N)
target=$(date -d "$1" +%s.%N)

seconds=$(echo "scale=9; $target - $current" | bc)

signchar=${seconds:0:1}
if [ "$signchar" = "-" ]; then
     error "You need to specify in a different way the moment in which this program has to finish, probably indicating the day and the hour like in this example: $NAME_PROGRAM \"2009/12/30 10:57\"."
fi

sleep "$seconds"

# // End of file
3
ответ дан 24 November 2019 в 11:56
поделиться
Другие вопросы по тегам:

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