cp
не знает то, что другие программы могут иметь открытые файлы. Нет никакого волшебства в cp
. Дизайн Unix целеустремленно старается не помещать любой вид, соединяет файлы, если нет неопровержимый довод (заставляющий значение, что ядру нужен он). По этой теме посмотрите, что перенаправление производит в файл, применяют блокировку на файл?
Такие ситуации, где файл производится производителем и, однажды завершенный, использованный потребителем, распространены. Обычный способ обработать это состоит в том, чтобы сделать, чтобы производитель записал временный файл, который потребитель не будет искать, затем после того как производитель закончен, перемещают файл в место, где потребитель найдет его. Перемещение файла (в той же файловой системе) является атомарной операцией: в какой-то момент, для потребителя, файл изменяется от того, чтобы не быть там к тому, чтобы быть там.
Поэтому примите меры, чтобы Ваше задание загрузки переместило файлы в другой каталог, когда оно закончит делать загрузку. Укажите на задание крона на этот другой каталог.
Причина - это TZ=UTC-8
интерпретируется как часовой пояс POSIX. В формате часового пояса POSIX 3 буквы являются сокращением часового пояса (который произволен), и число является числом часов, часовой пояс находится позади UTC. Так UTC-8
означает, что часовой пояс сократил "UTC", который является −8 часами позади реального UTC или UTC + 8 часов.
(Это прокладывает себе путь, потому что Unix был разработан в США, которые находятся позади UTC. Этот формат позволяет американским часовым поясам быть представленными как EST5, CST6, и т.д.),
Вы видите, что это - то, что происходит этими примерами:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
ISO -0800
формат часового пояса проявляет противоположный подход, с -
указание на зону находится позади UTC, и +
указание на зону перед UTC.
Каждый раз, когда Вы указываете часовой пояс в формате +/-00:00, Вы указываете смещение, не фактический часовой пояс. От GNU libc
документация (который следует стандарту POSIX):
Смещение указывает временную стоимость, которую необходимо добавить к местному времени для получения значения Всемирного координированного времени. Это имеет синтаксис как [+ |-] гд [: мм [: ss]]. Это положительно, если зона местного времени к западу от Главного меридиана и отрицательна, если это - восток. Час должен быть между 0 и 23, и минута и секунды между 0 и 59.
Поэтому это, кажется, реверс того, что Вы ожидаете.
Как альтернативный метод можно использовать команду zdump
показать текущее время в других часовых поясах + смещения.
Zdump печатает текущее время в каждом имени зоны, названном на командной строке.
Те же правила применяются с часовыми поясами; к западу от главного меридиана, находящегося, "позади" в то время как на восток, являющийся "вперед".
$ zdump PST PST суббота 7 декабря 3:25:27 20:13 PST
Я сделал этот сценарий, чтобы показать несколько из часовых поясов + смещения, что мы интересуемся использованием zdump
и date
таким образом, мы могли сравнить их.
$ cat cmd.bash
#!/bin/bash
printf "\ndate: %s\n\n" "$(date)"
for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
echo "-- timezone $tz"
printf "zdump: %s\n" "$(zdump $tz)"
printf "date: %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
echo ""
done
Затем при выполнении его, Вы видите сравнение zdump
кому: date
:
$ ./cmd.bash
date: Sat Dec 7 02:59:05 EST 2013
-- timezone EST
zdump: EST Sat Dec 7 02:59:05 2013 EST
date: Sat Dec 07 02:59:05 2013 - (EST -0500)
-- timezone PST
zdump: PST Sat Dec 7 07:59:05 2013 PST
date: Sat Dec 07 07:59:05 2013 - (PST +0000)
-- timezone PST+8
zdump: PST+8 Fri Dec 6 23:59:05 2013 PST
date: Fri Dec 06 23:59:05 2013 - (PST -0800)
-- timezone PST-8
zdump: PST-8 Sat Dec 7 15:59:05 2013 PST
date: Sat Dec 07 15:59:05 2013 - (PST +0800)
-- timezone UTC
zdump: UTC Sat Dec 7 07:59:05 2013 UTC
date: Sat Dec 07 07:59:05 2013 - (UTC +0000)
-- timezone UTC+8
zdump: UTC+8 Fri Dec 6 23:59:05 2013 UTC
date: Fri Dec 06 23:59:05 2013 - (UTC -0800)
-- timezone UTC-8
zdump: UTC-8 Sat Dec 7 15:59:05 2013 UTC
date: Sat Dec 07 15:59:05 2013 - (UTC +0800)
Почему?
Потому что POSIX требует .
Если перед ним стоит знак «-», часовой пояс должен находиться к востоку от нулевого меридиана; в противном случае он должен быть западным (что может быть обозначено необязательным предшествующим знаком «+»).
Таким образом, это даст время около [1] Лос-Анджелеса
(с любой трехбуквенной меткой для текста часового пояса):
$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800
$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800
И это должно дать время около Шанхая, Китай
или Перт, Австралия
:
$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800
$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800
[1] Рядом, потому что может действовать летнее время (DST), которое сдвигает фактическое «местное время».
TZ=PST+8 date
.Спасибо. Я также нашел это объяснение подman timezone
: "Строка станд. указывает название часового пояса и должна быть тремя или больше буквенными символами. Строка смещения сразу следует за станд. и указывает временную стоимость, которая будет добавлена к местному времени для получения Всемирного координированного времени (UTC). Смещение положительно, если локальный часовой пояс к западу от Главного меридиана и отрицателен, если это - восток. Час должен быть между 0 и 24, и минуты и секунды 0 и 59". – Alex Henrie 07.12.2013, 04:55TZ=America/Los_Angeles
. Вы забываете, что тихоокеанское время-7 в течение летнего времени. – Matt Johnson-Pint 07.12.2013, 10:13TZ=:America/Los_Angeles
. Двоеточие указывает, что это - файл часового пояса Olson. И в другом комментарии, он упомянул, что хотел проигнорировать летнее время, которое это не сделает. – cjm 07.12.2013, 13:32EST-5
CST-6
. – Evan Carroll 27.12.2017, 23:04