GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hora de inicio del proceso con zona horaria?

Estoy tratando de identificar si se crea un archivo después de iniciar el proceso o no. Estoy obteniendo la hora de inicio del proceso usando el comando ps -f -p PID -o lstart= . Esto me da un resultado como Fri May 5 09:15:35 2017 que no tiene información de zona horaria.

Por otro lado, el sistema de archivos me da fechas con zona horaria. Cuando comparo fechas obtengo un resultado incorrecto. Ejemplo:

  • inicio del proceso:2017-05-05 10:26:57 +0000 UTC
  • archivo modificado:2017-05-05 10:26:57.679508679 +0200 CEST

¿Es posible obtener la hora de inicio del proceso con un formato diferente, por ejemplo, como fecha de Unix? (Tener milisegundos también ayudaría)

Contexto:estoy ejecutando ps Comando desde una aplicación go y analizando el resultado.

Respuesta aceptada:

El sistema de archivos no le da una hora con la zona horaria, es cualquier comando que use para mostrar esa hora en un formato amigable para los humanos que puede darle una zona horaria si elige mostrar la hora en la hora local (según lo especificado por /etc/localtime , $TZ u otro).

Generalmente, las marcas de tiempo en Unix se expresan de una manera que es irrelevante para las zonas horarias. El tiempo de época de Unix es el número de segundos (segundos expresados ​​como la parte 86400 de un día, por lo que varía en longitud pero es más útil para el cálculo del calendario) desde un evento preciso en la historia (1970-01-01 00:00:00 UTC, un tiempo inequívoco). Las zonas horarias solo entran en escena cuando se muestra una fecha en formato de calendario a un ser humano.

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

ambos le dan la hora local. date podría generar el desplazamiento de la zona horaria o no según la configuración regional. Si desea la hora UTC, ejecútela bajo TZ=UTC0 :

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

GNU date es capaz de analizar la fecha reportada por ps , para que pueda convertirlo a cualquier formato, como el tiempo de época de Unix:

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

(arriba usando la hora UTC. También funcionaría con cualquier hora local en su entorno excepto por una hora en el año donde una salida de hora sin indicación TZ es ambigua (en zonas que implementan DST)).

En cualquier caso, la hora de inicio de un proceso no tiene por qué ser (y nunca es exactamente) la hora en que ese proceso ejecutó el comando que está ejecutando actualmente. Por ejemplo:

$ 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

Ese proceso 9397 está ejecutando 4 comandos en su tiempo de vida:strace (bifurcado allí), sh , env , ps . El tiempo informado por ps corresponde al momento en que fue bifurcado por strace , no cuando ejecutó ps .

Si desea obtener una precisión de subsegundos (hasta 1/$(getconf CLK_TCK) ), con zsh , podrías hacer:

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

Es decir, obtenemos la hora de inicio de $pid y de una subcapa recién creada (que son los campos 20 después de la última aparición de un ) carácter en /proc/pid/stat expresado en CLK_TCK en versiones modernas de Linux), divida la diferencia entre CLK_TCK y agregar a la hora actual.

Relacionado:¿Por qué no puedo escapar de los espacios en un script bash?
Linux
  1. Cómo establecer o cambiar la zona horaria en Linux

  2. ¿Iniciar un proceso en un Tty diferente?

  3. Configure o cambie la zona horaria con el comando set-timezone

  4. Ejecutar proceso con salida en tiempo real en PHP

  5. Estados de proceso de Linux

Administre NTP con Chrony

Cómo cambiar la hora en Kali Linux

Comando Killall en Linux con ejemplos

Ordenar la gestión de procesos con ps o systemd

Programación con cron &At

¿Cómo configuro monit para iniciar un proceso con un usuario específico?