Время начала процесса с часовым поясом

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

В любом случае, выходные данные сервера и локального хоста различаются.Тот, что с сервера, выглядит так же, как от wget . Проверьте download.file.method , который должен быть установлен на internal (согласно docs ) - только этот метод поддерживает добавление в файл.

3
05.05.2017, 13:53
1 ответ

Файловая система не дает вам время с часовым поясом, это любая команда, которую вы используете для отображения этого времени в удобном для человека формате, который может дать вам часовой пояс, если он решит отобразить время по местному времени (как указано в /etc/localtime, $TZ или другом).

Как правило, временные метки в Unix выражаются способом, который не имеет отношения к часовым поясам. Время эпохи unix — это количество секунд (секунды, выраженные как 86400-я часть дня, поэтому различаются по длине, но более полезны для календарных расчетов) с момента точного события в истории (1970-01-01 00:00:00 UTC, однозначное время).Часовые пояса появляются только при отображении даты в формате календаря для человека.

ps -o lstart= -p "$pid"
date -r /some/file

оба показывают местное время. date может выводить смещение часового пояса или нет, в зависимости от локали. Если вам нужно время UTC, запустите их под TZ=UTC0:

TZ=UTC0 ps -o lstart= -p "$pid"
TZ-UTC0 date -r /some/file # or use date -u

GNU date может проанализировать дату, сообщенную ps, так что вы можете преобразовать его в любой формат, например время эпохи unix:

(export TZ=UTC0
date -d "$(ps -o lstart -p "$pid") +%s
date -r /some/file +%s)

(выше использования времени UTC. Это также будет работать с любым местным временем в вашей среде, за исключением одного часа в году, когда вывод времени без указания TZ неоднозначен (в зонах, реализующих переход на летнее время)).

В любом случае время запуска процесса не обязательно должно совпадать (и никогда точно не совпадать) с временем, когда процесс выполнил текущую команду. Например:

$ TZ=UTC0 strace -qtt -e execve sh -c 'sleep 3; exec env ps -o lstart= -p "$$"'
10:27:24.877397 execve("/bin/sh", ["sh", "-c", "sleep 3; exec env ps -o lstart= "...], [/* 28 vars */]) = 0
10:27:27.882553 execve("/usr/bin/env", ["env", "ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
10:27:27.885272 execve("/bin/ps", ["ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
Fri May  5 10:27:24 2017

Этот процесс 9397 выполняет 4 команды за время своего существования: strace (разветвлено там), sh, env, ps . Время, сообщаемое ps, соответствует времени его разветвления strace, а не времени выполнения ps.

Если вы хотите получить точность до долей секунды (до 1/$(getconf CLK_TCK)) с помощью zsh, вы можете сделать:

zmodload zsh/datetime
tick=$(getconf CLK_TCK)
(echo $((EPOCHREALTIME + (${${=$(</proc/self/stat)##*)}[20]}. -
          ${${=$(</proc/$pid/stat)##*)}[20]})/tick)))

То есть мы начинаем время $pid и вновь созданной подоболочки (это 20-е поля после последнего появления символа ) в /proc/pid/stat, выраженное в CLK_TCK в современных версиях Linux), разделите разницу на CLK_TCK и прибавьте к текущему времени.

4
27.01.2020, 21:18

Теги

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