Format output cputime untuk ps

12

Saya mencoba menulis sebuah skrip yang dapat memantau penggunaan CPU suatu proses dalam suatu interval (untuk membuat grafik).

Sejauh ini, ini adalah perintah yang saya gunakan

ps -p $PROCID -o cputime,etimes

Satu-satunya kekhawatiran saya adalah bahwa output cputime tampaknya [dd]hh:mm(atau sesuatu yang serupa, tidak bisa mengingat di atas kepala saya sekarang)

Apakah ada cara untuk memformat cputime dalam hitungan detik, seperti etime -> etimes untuk mendapatkan waktu yang berlalu dalam hitungan detik?

Sunting: Ini adalah keluaran yang saya terima saat ini

2-03:01:33 2653793

Saya ingin parameter pertama diformat dalam hitungan detik, bukan hari-jam: menit: detik.

dreadiscool
sumber
Bisakah Anda menambahkan output yang Anda terima sekarang dan output yang ingin Anda terima?
Simply_Me
@Simply_Me Saya telah mengedit posting
dreadiscool
@ John1024 Ya, itu, itu jumlah hari.
dreadiscool

Jawaban:

9

Ini mengonversi pertama kali menjadi detik:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

Sebagai contoh, perintah ps menghasilkan:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

The awkperintah memproses itu dan kembali:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

Penjelasan

  • -F'[: ]+'

    Ini memberitahu awk untuk memperlakukan titik dua dan spasi sebagai pemisah bidang. Dengan cara ini, jam, menit, dan detik muncul sebagai bidang terpisah.

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    Awal /:/membatasi kode untuk hanya bekerja pada baris yang menyertakan titik dua. Ini menghapus garis header. Jumlah detik dihitung dari jam, menit, detik melalui t=$3+60*($2+60*$1). Nilai yang dihasilkan untuk tkemudian dicetak bersama dengan waktu yang telah berlalu.

Hari-hari penanganan

Jika psmenghasilkan hari, jam, menit, detik, seperti pada:

2-03:01:33

Kemudian, gunakan kode ini sebagai gantinya:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

Jika berhari-hari mungkin atau tidak bergantung pada output, maka gunakan perintah kombinasi ini:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'
John1024
sumber
Maafkan saya jika saya salah, tetapi sepertinya perintah ini tidak memperhitungkan hari-hari akun, yang juga dapat
dituliskan sebelumnya
Itu benar: sistem saya tidak menunjukkan hari untuk proses apa pun. Saya bisa menebak seperti apa hari itu, tetapi dapatkah Anda memberikan contoh yang sebenarnya?
John1024
2-03: 01: 33 adalah 2 hari, 3 jam, 1 menit, dan 33 detik. Hari-hari tidak selalu mendapat tambahan. Di sistem saya, ini hanya ditayangkan jika proses telah hidup selama lebih dari 24 jam. Terima kasih atas bantuan Anda sejauh ini, saya menghargainya
dreadiscool
@ user1772510 Jawaban diperbarui untuk menangani hari.
John1024
Terima kasih atas semua bantuan Anda, jika saya bisa meningkatkan saya akan meningkatkan juga (tidak cukup perwakilan di komunitas ini) Saya sangat menghargainya!
dreadiscool
2

Jika Anda tidak ingin membawa awk dalam game, solusi bash murni (t_str berisi string yang diformat, t_sec waktu yang diterjemahkan dalam hitungan detik):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi
Nicolas Breton
sumber
0

Anda tidak menentukan sistem operasi untuk apa ini; jika itu adalah Linux, dan mengingat Anda tertarik untuk memantau proses tertentu, Anda mungkin merasa lebih bermanfaat untuk menguraikan /proc/$PROCID/stat- lihat proc(5)halaman manual untuk detailnya.

Toby Speight
sumber