GNU/Linux >> Belajar Linux >  >> Linux

Proses Waktu Mulai Dengan Zona Waktu?

Saya mencoba mengidentifikasi apakah file dibuat setelah memulai proses atau tidak. Saya mendapatkan waktu mulai proses menggunakan perintah ps -f -p PID -o lstart= . Ini memberi saya hasil seperti Fri May 5 09:15:35 2017 yang tidak memiliki informasi zona waktu.

Di sisi lain, sistem file memberi saya tanggal dengan zona waktu. Ketika saya membandingkan tanggal saya mendapatkan hasil yang salah. Contoh:

  • proses dimulai:2017-05-05 10:26:57 +0000 UTC
  • berkas diubah:2017-05-05 10:26:57.679508679 +0200 CEST

Apakah mungkin untuk mendapatkan waktu mulai proses dengan format yang berbeda, misalnya sebagai tanggal unix? (Memiliki milidetik juga akan membantu)

Konteks:Saya menjalankan ps perintah dari aplikasi go dan menguraikan hasilnya.

Jawaban yang Diterima:

Sistem file tidak memberi Anda waktu dengan zona waktu, itu adalah perintah apa pun yang Anda gunakan untuk menampilkan waktu itu dalam format ramah manusia yang dapat memberi Anda zona waktu jika memilih untuk menampilkan waktu dalam waktu lokal (seperti yang ditentukan oleh /etc/localtime , $TZ atau lainnya).

Umumnya, cap waktu di Unix diekspresikan dengan cara yang tidak relevan dengan zona waktu. Waktu epoch unix adalah jumlah detik (detik dinyatakan sebagai bagian ke-86400 dari suatu hari, sehingga panjangnya bervariasi tetapi lebih berguna untuk perhitungan kalender) sejak peristiwa yang tepat dalam sejarah (1970-01-01 00:00:00 UTC, waktu yang jelas). Zona waktu hanya muncul saat menampilkan tanggal dalam format kalender kepada manusia.

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

keduanya memberi Anda waktu setempat. date mungkin menampilkan offset zona waktu atau tidak tergantung pada lokal. Jika Anda menginginkan waktu UTC, jalankan di bawah TZ=UTC0 :

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

GNU date dapat mengurai tanggal yang dilaporkan oleh ps , sehingga Anda dapat mengonversinya ke format apa pun, seperti waktu zaman unix:

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

(di atas menggunakan waktu UTC. Ini juga akan bekerja dengan waktu lokal apa pun di lingkungan Anda kecuali satu jam dalam satu tahun di mana keluaran waktu tanpa indikasi TZ tidak jelas (di zona yang menerapkan DST)).

Bagaimanapun, waktu mulai dari suatu proses tidak harus (dan tidak pernah persis) waktu proses itu mengeksekusi perintah yang sedang dijalankannya. Misalnya:

$ 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

Proses 9397 itu menjalankan 4 perintah dalam waktu hidupnya:strace (bercabang di sana), sh , env , ps . Waktu yang dilaporkan oleh ps sesuai dengan waktu ketika itu bercabang oleh strace , bukan saat dijalankan ps .

Jika Anda ingin mendapatkan presisi subdetik (hingga 1/$(getconf CLK_TCK) ), dengan zsh , Anda dapat melakukan:

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

Artinya, kita mendapatkan waktu mulai dari $pid dan subkulit yang baru dibuat (yaitu bidang ke-20 setelah kemunculan terakhir ) karakter di /proc/pid/stat dinyatakan dalam CLK_TCK dalam versi Linux modern), bagi perbedaannya dengan CLK_TCK dan tambahkan ke waktu saat ini.

Terkait:Mengapa saya tidak dapat keluar dari spasi pada skrip bash ??
Linux
  1. Cara Mengatur atau Mengubah Zona Waktu di Linux

  2. Mengapa Waktu Unix Mulai Pada 1970-01-01?

  3. Mendefinisikan variabel dengan atau tanpa ekspor

  1. Jalankan proses dengan output realtime di PHP

  2. Status Proses Linux

  3. Java ProcessBuilder:Proses yang Dihasilkan Hang

  1. Bagaimana cara mendapatkan waktu mulai dari proses Linux yang sudah berjalan lama?

  2. Bagaimana cara memulai proses dalam grup prosesnya sendiri?

  3. Tidak dapat memulai layanan postgresql di CentOS 7