Схема должна быть в следующем порядке:
Таким образом, в вашем случае правильный порядок будет:
new StructType(Array(
StructField("cnt", IntegerType, nullable = true),
StructField("key", StringType, nullable = true),
StructField("date", StringType, nullable = true)
))
Как упомянуто Программистом Преступника, я думаю, что решение состоит в том, чтобы только спать для корректного числа секунд.
, Чтобы сделать это в ударе, сделайте следующее:
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
вместо этого → см. эти инструкции
Вы могли, возможно, использовать 'в' отправить сигнал в Ваш сценарий, который находился, ожидая того сигнала.
Можно вычислить число секунд между теперь и время пробуждения и использовать существующую команду 'сна'.
Можно мешать процессу выполниться, путем отправки ему сигнала SIGSTOP, и затем заставить его продолжать выполняться путем отправки ему сигнала SIGCONT.
, Таким образом, Вы могли остановить свой сценарий отправкой, SIGSTOP:
kill -SIGSTOP <pid>
И затем используют в deamon для пробуждения его путем отправки ему SIGCONT таким же образом.
, По-видимому, Ваш сценарий сообщит в того, когда он хотел быть разбуженным прежде, чем поместить себя для сна.
Используйте 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
Все сделанные!
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
$
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
Мне нужен был сценарий, который проверял бы только часы и минуты, чтобы я мог запускать сценарий с одними и теми же параметрами каждый день. Я не хочу беспокоиться о том, какой день будет завтра. Поэтому я использовал другой подход.
target="$1.$2"
cur=$(date '+%H.%M')
while test $target != $cur; do
sleep 59
cur=$(date '+%H.%M')
done
параметры скрипта - это часы и минуты, так что я могу написать что-то вроде:
til 7 45 && mplayer song.ogg
(til - название скрипта)
больше не опаздывать на работу на несколько дней, потому что вы ошиблись в выборе дня. ура!