Ps için cputime çıktısını biçimlendirin


13

(Bir grafik oluşturmak için) bir işlemin CPU kullanımını bir aralıkta izleyebilir bir komut dosyası yazmaya çalışıyorum.

Şimdiye kadar kullandığım komut bu

ps -p $PROCID -o cputime,etimes

Tek endişem, cputime çıktısının [dd]hh:mm(ya da benzer bir şeyin, şimdi kafamın üstünü hatırlayamadığı) görünmesi.

Saniyede geçen zamanı biçimlendirmek için saniyeler içinde, örneğin etime -> etimes gibi biçimlendirmenin bir yolu var mı?

Düzenleme: Bu, şu anda aldığım çıktıdır

2-03:01:33 2653793

İlk parametrenin gün-saat: dakika: saniye değil, saniyeler içinde biçimlendirilmesini istiyorum.


lütfen şimdi aldığınız çıktıyı ve almak istediğiniz çıktıyı ekleyebilir misiniz?
Simply_Me

@Simply_Me Yazıyı düzenledim
dreadiscool

@ John1024 Evet, öyle, gün sayısı.
dreadiscool

Yanıtlar:


9

Bu, ilk kez saniyeye dönüştürür:

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

Örnek olarak ps komutu şunu üretir:

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

awkKomut olduğunu ve iadeler işler:

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

açıklama

  • -F'[: ]+'

    Bu, awk'ye hem kolonlara hem de boşluklara alan ayırıcılar olarak davranmasını söyler. Bu şekilde, saat, dakika ve saniye ayrı alanlar olarak görünür.

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

    İlk /:/harf, kodun yalnızca iki nokta üst üste içeren satırlarda çalışmasını kısıtlar. Bu başlık satırlarını kaldırır. Saniye sayısı, saat, dakika, saniye ile üzerinden hesaplanır t=$3+60*($2+60*$1). Sonuçta elde edilen değer tdaha sonra geçen süre boyunca yazdırılır.

Taşıma günleri

Aşağıdaki gibi psgünler, saatler, dakikalar, saniyeler üretirse:

2-03:01:33

Ardından, bunun yerine şu kodu kullanın:

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

Çıktıya gün eklenebilir veya eklenmeyebilirse, bu kombinasyon komutunu kullanın:

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}'

Yanılıyorsam beni affet, ama bu komutun da günlerce dikkate alındığı
görülmüyor

Bu doğru: sistemim herhangi bir işlem için gün göstermedi. Hangi günlerin nasıl görünebileceğini tahmin edebilirim, ancak gerçek bir örnek verebilir misiniz?
John1024

2-03: 01: 33, 2 gün, 3 saat, 1 dakika ve 33 saniyedir. Yine de günler her zaman başlamaz. Sistemimde ancak işlem 24 saatten uzun süredir yaşıyorsa önerilir. Bugüne kadar yardımlarınız için teşekkürler btw, takdir ediyorum
dreadiscool

@ user1772510 Yanıt günleri işlemek için güncellendi.
John1024

Tüm yardımlarınız için teşekkürler, eğer ben de vekalet edersem ben de vekalet ederim (bu toplulukta yeterli temsil değil) Bunu derinden takdir ediyorum!
dreadiscool

2

Oyuna awk getirmek istemiyorsanız, saf bir bash çözümü (t_str, biçimlendirilmiş dizeyi içerir, t_sec kod çözme süresini saniye cinsinden içerir):

# 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

0

Bunun hangi işletim sistemi için olduğunu belirtmezsiniz; Linux ise ve belirli bir işlemi izlemekle ilgileniyorsanız, ayrıştırmayı daha faydalı bulabilirsiniz /proc/$PROCID/stat- ayrıntılar için proc(5)kılavuz sayfasına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.