Dmesg টাইমস্ট্যাম্পকে কাস্টম তারিখের ফর্ম্যাটে রূপান্তর করুন


111

আমি dmesg টাইমস্ট্যাম্পটি বোঝার চেষ্টা করছি এবং এটি জাভা তারিখ / কাস্টম তারিখের ফর্ম্যাটে রূপান্তর করতে এটিকে রূপান্তর করা কঠিন।

কোন সাহায্যের অনেক প্রশংসা করা হয়.

নমুনা dmesg লগ:

[14614.647880] airo(eth1): link lost (missed beacons)

ধন্যবাদ!

উত্তর:


179

dmesgটাইমস্ট্যাম্প বোঝা বেশ সহজ: কার্নেল শুরু হওয়ার পরে এটি কয়েক সেকেন্ডের মধ্যে। সুতরাং, শুরুর সময় থাকার সময় ( uptime), আপনি সেকেন্ড যোগ করতে পারেন এবং আপনার পছন্দমতো বিন্যাসে সেগুলি প্রদর্শন করতে পারেন।

বা আরও ভাল, আপনি -Tকমান্ড লাইন বিকল্পটি ব্যবহার করতে dmesgএবং মানব পাঠযোগ্য বিন্যাসকে বিশ্লেষণ করতে পারেন ।

থেকে man পৃষ্ঠা :

-T, --ctime
    Print human readable timestamps. The timestamp could be inaccurate!

    The time source used for the logs is not updated after system SUSPEND/RESUME.

10
কোন আদেশ-টি গ্রহণ করে? আমার dmesg না, ম্যানপেজ এটিও বলে না। (লিনাক্স মিন্ট দেবিয়ান সংস্করণ)।
গির্জ্যাব্রাহাম

1
মাইন ( উবুন্টু 13.04 এর অধীনে dmesgথেকে util-linux 2.20.1)

2
রেডহ্যাট এবং / অথবা ওরাকল লিনাক্স 5.6 এ উপলব্ধ নয়, rpm -qf /bin/dmesg => util-linux-2.13-0.56.0.2.el5
মাইকেল

7
util-linux 2.20প্রকাশের নোট অনুসারে এই বিকল্পটি উপস্থিত হয়েছিল : ftp.kernel.org/pub/linux/utils/util-linux/v2.20/…
ks1322

1
@ অনুগামীদের অনুসরণের জন্য ধন্যবাদ, এটি আপনার খুব সুন্দর :) প্রশ্নটি সম্পর্কে, আমি মনে করি যে বোঝার অংশটি ছোট এবং "এটি রূপান্তরিত করে জাভা তারিখ / কাস্টম তারিখের ফর্ম্যাটে রূপান্তর করুন" " মূল অংশ ছিল, কিন্তু আপনার মতামত পৃথক হতে পারে। আপনার দিনটি

32

সাহায্যে উত্তর, আমি একটি কার্যসংক্রান্ত আপনার .bashrc করা রূপান্তর তোলে লিখেছিলেন। আপনার কাছে টাইমস্ট্যাম্প না থাকলে বা ইতিমধ্যে সঠিক টাইমস্ট্যাম্প না থাকলে এটি কিছুতেই ভাঙ্গবে না।

dmesg_with_human_timestamps () {
    $(type -P dmesg) "$@" | perl -w -e 'use strict;
        my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./);
        foreach my $line (<>) {
            printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line )
        }'
}
alias dmesg=dmesg_with_human_timestamps

এছাড়াও, dmesg টাইমস্ট্যাম্প রূপান্তর যুক্তি এবং যখন কিছুই নেই তখন কীভাবে টাইমস্ট্যাম্পগুলি সক্ষম করবেন সে সম্পর্কে একটি ভাল পঠন: https://supportcenter.checkPoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk92677


সামান্য উন্নতি: আপনি পাইপলাইনে 'লেজ -1' মুছে ফেলতে পারেন এবং কেবল বাজেটিকে লাইন খেতে দিন এবং এর বাফারে চূড়ান্ত লাইন থেকে মুদ্রণ করতে পারেন। local dmesg_bin=$(type -a dmesg | awk 'END { print $NF }')
ব্রায়ান ওন

@ লুকাস: আপনি কি type (কোন dmesg) এর পরিবর্তে 'টাইপ -a dmesg | ...' ব্যবহার করে ব্যাখ্যা করতে পারেন? সেই পাথ পেতে কোনও 3-পর্যায়ের পাইপের সুবিধা রয়েছে কি?
স্টেলেডোগ

@ স্টেজেডোগ: ভাল প্রশ্ন। typeওভার কেন ব্যবহার করছেন তার একটি ব্যাখ্যার জন্য which, এই প্রশ্নটি দেখুন । অপ্রয়োজনীয় ট্রিপল পাইপটি এড়াতে আমি আমার উত্তর সম্পাদনা করেছি।
লুকাস সিমন

এই বাশ / পার্ল স্নিপেটটি আমার জন্য কাজ করেছিল, আমার একটি পুরানো আরএইচইল 5.7 মেশিন রয়েছে যা আমাকে দেখাশোনা করতে হবে এবং মানব সময়কালে টাইমস্ট্যাম্প মুদ্রণের জন্য ডেমসগের কোনও বিকল্প নেই।
পল এম

17

RHEL / CentOS 6 এর মতো "dmesg -T" ব্যতীত সিস্টেমগুলির জন্য, আমি লুকাশ -চিমন দ্বারা সরবরাহিত "dmesg_with_human_timestamps" ফাংশনটি পছন্দ করেছি । যদিও বড় আপটাইম সহ আমাদের কিছু বাক্সে এটি কিছুটা সমস্যা হয়েছে। দেখা যাচ্ছে যে ডেমসগে থাকা কার্নেল টাইমস্ট্যাম্পগুলি পৃথক সিপিইউ দ্বারা রাখা একটি আপটাইম মান থেকে প্রাপ্ত। সময়ের সাথে সাথে এটি বাস্তব সময়ের ঘড়ির সাথে সিঙ্কের বাইরে চলে যায়। ফলস্বরূপ, সাম্প্রতিক ডেমস্যাগ এন্ট্রিগুলির জন্য সর্বাধিক নির্ভুল রূপান্তরটি সিপিইউ ঘড়ির উপর ভিত্তি করে / প্রোক / আপটাইম হবে। উদাহরণস্বরূপ, এখানে একটি নির্দিষ্ট CentOS 6.6 বাক্সে:

# grep "\.clock" /proc/sched_debug  | head -1
  .clock                         : 32103895072.444568
# uptime
 15:54:05 up 371 days, 19:09,  4 users,  load average: 3.41, 3.62, 3.57
# cat /proc/uptime
32123362.57 638648955.00

মিলি সেকেন্ডে থাকা সিপিইউ আপটাইমের জন্য অ্যাকাউন্টিং, এখানে প্রায় 5/2 ঘন্টা অফসেট রয়েছে। সুতরাং আমি স্ক্রিপ্টটি সংশোধন করেছি এবং এটিকে প্রক্রিয়াতে দেশীয় ব্যাশে রূপান্তর করেছি:

dmesg_with_human_timestamps () {
    FORMAT="%a %b %d %H:%M:%S %Y"

    now=$(date +%s)
    cputime_line=$(grep -m1 "\.clock" /proc/sched_debug)

    if [[ $cputime_line =~ [^0-9]*([0-9]*).* ]]; then
        cputime=$((BASH_REMATCH[1] / 1000))
    fi

    dmesg | while IFS= read -r line; do
        if [[ $line =~ ^\[\ *([0-9]+)\.[0-9]+\]\ (.*) ]]; then
            stamp=$((now-cputime+BASH_REMATCH[1]))
            echo "[$(date +"${FORMAT}" --date=@${stamp})] ${BASH_REMATCH[2]}"
        else
            echo "$line"
        fi
    done
}

alias dmesgt=dmesg_with_human_timestamps

ফাংশন zsh এ কাজ করে নি। যথাযথভাবে এটি করা উচিত do এটি বলেছে যে, 221 দিনের আপটাইম সহ একটি বাক্সে, এই সমাধানটি সময়টির স্ট্যাম্পকে বাস্তবের মিনিটের মধ্যে ফেলেছিল। অন্যান্য সমাধানগুলি দিনের 2+ ঘন্টা আগে মূল কারণ ইভেন্টটি ঘটায়। ধন্যবাদ, অ্যালেন তুমি আমার বিকেল বাঁচিয়েছ
ট্রেনটন

RHEL5.x মেশিনে / proc / वेळापत्रक_দেবগ রয়েছে বলে মনে হয় না :-(
পল এম

14

সুতরাং কেভজিরো একটি কম কলডজি সমাধানের জন্য অনুরোধ করেছে, তাই আমি নিম্নলিখিতগুলি নিয়ে এসেছি:

sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'

এখানে একটি উদাহরণ:

$ dmesg|tail | sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'
[2015-12-09T04:29:20 COT] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[2015-12-09T04:29:23 COT] wlp3s0: authenticate with dc:9f:db:92:d3:07
[2015-12-09T04:29:23 COT] wlp3s0: send auth to dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: authenticated
[2015-12-09T04:29:23 COT] wlp3s0: associate with dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: RX AssocResp from dc:9f:db:92:d3:07 (capab=0x431 status=0 aid=6)
[2015-12-09T04:29:23 COT] wlp3s0: associated
[2015-12-09T04:29:56 COT] thinkpad_acpi: EC reports that Thermal Table has changed
[2015-12-09T04:29:59 COT] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
[2015-12-09T05:00:52 COT] thinkpad_acpi: EC reports that Thermal Table has changed

আপনি যদি এটি আরও কিছুটা ভাল সঞ্চালন করতে চান তবে প্র্যাক থেকে টাইমস্ট্যাম্প পরিবর্তে একটি ভেরিয়েবলের মধ্যে রেখে দিন :)


4

ডেমসগের সাম্প্রতিক সংস্করণগুলিতে, আপনি কেবল কল করতে পারেন dmesg -T


3
একই উত্তর ইতিমধ্যে আপনার দু'বছর আগে আরসি দিয়েছিল।
জোছ

4

আপনার যদি অ্যান্ডয়েডের উদাহরণ হিসাবে -Tবিকল্প না থাকে তবে dmesgআপনি busyboxসংস্করণটি ব্যবহার করতে পারেন । নিম্নলিখিত আরও কিছু সমস্যা সমাধান করে:

  1. [0.0000]বিন্যাস কিছু জিনিষের পাল্টাপাল্টি রঙ তথ্য মনে হচ্ছে, উপসর্গ চাই যে পূর্বে হয় <6>
  2. ফ্লোট থেকে পূর্ণসংখ্যা তৈরি করুন।

এটি এই ব্লগ পোস্ট দ্বারা অনুপ্রাণিত ।

#!/bin/sh                                                                                                               
# Translate dmesg timestamps to human readable format                                                                   

# uptime in seconds                                                                                                     
uptime=$(cut -d " " -f 1 /proc/uptime)                                                                                  

# remove fraction                                                                                                       
uptime=$(echo $uptime | cut -d "." -f1)                                                                                 

# run only if timestamps are enabled                                                                                    
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then                                                          
  dmesg | sed "s/[^\[]*\[/\[/" | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do      
    timestamp=$(echo $timestamp | cut -d "." -f1)                                                                       
    ts1=$(( $(busybox date +%s) - $uptime + $timestamp ))                                                               
    ts2=$(busybox date -d "@${ts1}")                                                                                    
    printf "[%s] %s\n" "$ts2" "$message"                                                                                
  done                                                                                                                  
else                                                                                                                    
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"                                                   
fi                                                                                                                      

তবে দ্রষ্টব্য যে এই প্রয়োগটি বেশ ধীর।


3

আপনাকে / প্রোক / স্ট্যাটে "বিটাইম" রেফারেন্স করতে হবে যা ইউনিক্স যুগের সময় যখন সিস্টেমটি সর্বশেষ বুট করা হয়েছিল। তারপরে আপনি সেই সিস্টেমে বুট সময় ভিত্তিক করতে পারেন এবং তারপরে প্রতিটি ইভেন্টের টাইমস্ট্যাম্প গণনা করার জন্য dmesg এ প্রদত্ত অতিবাহিত সেকেন্ডগুলিতে যোগ করতে পারেন।


3

পুরানো লিনাক্স ডিস্ট্রোসের সাথে আরও একটি বিকল্প মোড়ক স্ক্রিপ্ট ব্যবহার করা, যেমন পার্ল বা পাইথনে।

সমাধান এখানে দেখুন:

http://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable?lang=en http://jmorano.moretrix.com/2012/03/dmesg-human-readable-timestamps/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.