এই বছরে আমি আমার ল্যাপটপে মোট সময় ব্যয় করব কীভাবে?


17

২০১ laptop সালে আমার ল্যাপটপে কাজ করার জন্য আমি মোট সময় জানতে আগ্রহী।

last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'

আমাকে এই ফর্ম্যাটে ল্যাপটপের মোট আপটাইম দেয়:

(01:33) 
(04:40) 
(01:31) 
(1+06:41) 
(02:47) 
(00:30)

এখন আমি কীভাবে এটি যুক্ত করব?


আপনি আমাকে (1 + 06: 41) এর অর্থ বলতে পারেন?
কাশীশ

@কাশীশ 1 দিন, 6 ঘন্টা, 41 মিনিট
মুরু

জিনিসটি হ'ল wtmpলগগুলি (যা আপনি lastকমান্ডের আউটপুটে দেখেন ) মাসিক (ইন /etc/logrotate.conf) ঘোরানোর জন্য সেট করা হয় , যার অর্থ নির্দিষ্ট সময়ের পরে, প্রাচীনতম লগ মুছে ফেলা হয়। অন্য কথায়, আপনি যা যা করার চেষ্টা করছেন lastতা সঠিক হবে না
সের্গি কলডিয়াজহনি

@ সার্জ আমি ডাব্লুটিএমপি-র জন্য লোগ্রোটেট অক্ষম করেছি। আমি এটি করার পরে এক বছরের বেশি সময় হয়েছে, এবং ফাইলের আকার বর্তমানে 3.7M। সুতরাং কেন এটি মাসিক ঘোরানো উচিত তার কোনও কারণ আমি দেখছি না। ;)
ডাল্টনফুরি 42

@ daltonfury42 এটি অক্ষম থাকলে এটি ঘোরবে না। বেশিরভাগ ব্যবহারকারীরা তা করেন না।
সের্গেই কোলোডিয়াযনি

উত্তর:


5

এখানে একটি awk + awk সংস্করণ রয়েছে:

last ... | awk '/reboot/{print $NF}' |
    awk -F '[(+:)]' '
        {
            d += $(NF - 3); h += $(NF - 2); m += $(NF - 1)
        }
        END {
            carry = m / 60; h += carry;
            carry = h / 24; d += carry;
            printf "%d days, %d hours, %d minutes\n", d, h % 24, m % 60
        }'

lastশেষ কলামটি বিন্যাসে রয়েছে (<days>+hours:minutes), যেখানেdays+ যদি সময়কাল 1 দিনের কম হয় তবে বাদ দেওয়া হয়।

এখানে, প্রথম awkকমান্ডটি শেষ কলামটি, আগ্রহের সময়কালকে আউটপুট করেreboot এন্ট্রিগুলির ।

দ্বিতীয় awkআদেশের জন্য:

  1. FSহয় [(+:)], অর্থাত্, প্রথম বন্ধনী বা + বা : । সুতরাং, (h:m)করতে বিভক্ত করা , h, mএবং (প্রথম এবং শেষ ক্ষেত্র খালি), এবং (d+h:m)থেকে বিভক্ত করা , d, h, mএবং (আবার, প্রথম ও শেষ ক্ষেত্র খালি)।
  2. তারপরে আমরা কয়েক মিনিটের জন্য দ্বিতীয়-শেষ ক্ষেত্রটি গ্রহণ করি, কয়েক ঘন্টা তৃতীয়-শেষ এবং কয়েক দিনের জন্য চতুর্থ-শেষ field চতুর্থ-শেষ ক্ষেত্র দিনগুলি উপস্থিত না থাকলে প্রথম, খালি, ক্ষেত্র হবে। সুতরাং, আমরা সহজভাবে 0এই ক্ষেত্রে যুক্ত করা হবে।
  3. তারপরে আমরা মিনিট এবং ঘন্টা যথাক্রমে and০ এবং ২৪ এর উপরে হলে ঘন্টা এবং দিনগুলিকে ধাক্কা দেব। নোট করুন যে awk ভাসমান পয়েন্ট বিভাগ করে, তাই hএবং dএখন ভগ্নাংশ অংশ হতে পারে।
  4. তারপরে আমরা সংখ্যাগুলি পূর্ণসংখ্যা হিসাবে মুদ্রণ করি ( %d), সুতরাং কোনও ভগ্নাংশ অংশ উপেক্ষা করা হবে।

8

বাশ স্ক্রিপ্ট দিয়ে চেষ্টা করে এবং আপনার আদেশটি প্রসারিত করছে। আমি ব্যবহার করিdateutils সময়কাল যোগ করতে ।

সুতরাং এই স্ক্রিপ্টটি ব্যবহার করার জন্য একটির dateutilsমাধ্যমে প্যাকেজ উপলব্ধ থাকা দরকার apt। (sudo apt install dateutils )

এই স্ক্রিপ্টটি বর্তমান আপটাইম (বর্তমান অধিবেশন )টিকেও বিবেচনা করে, সুতরাং আরও নির্ভুল। সেকেন্ড গণনা করা হয় না। সর্বনিম্ন ইউনিট প্রতিবেদন করা মিনিট।

#!/bin/bash
# Total uptime reported.
temp=$(last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)'  )
echo "Total run time (days:hours:minutes)"
curr="2015-01-01T"$curr
org="2015-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
  • সর্বশেষ রিবুটটি থেকে প্রথম আপটাইমগুলি তালিকা, দিন, ঘন্টা, মিনিট এবং দ্বিতীয় তথ্যগুলি নিষ্কাশন করতে ফর্ম্যাট করা হয়। এটি তখন সংরক্ষণ করা হয়temp
  • Org = নামক একটি রেফারেন্স জাল তারিখ সেট করা হয়2015-01-01 যা বর্তমান আপটাইম যুক্ত হয়।
  • তারপরে সমস্ত চলক আপটাইমগুলি চলকটিতে যুক্ত করা হয় new
  • orgনেট আপটাইমের মধ্যে এবং সময়কাল পার্থক্য অনুসারে newপাওয়া যায়।

আউটপুট:

vayu@helix:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m

স্ক্রিপ্টটি চালিত হওয়ার দিন থেকে ঠিক এক বছরের মধ্যে নিম্নলিখিত স্ক্রিপ্টটি আপটাইম জন্য ।

#!/bin/bash
# Total uptime reported since exactly 1 year (from the time script is run).
now="$(date +'%Y-%m-%d')" ;
last_y=$(dateutils.dadd $now -1y)
temp=$(last reboot --since "$last_y" --until "$now" | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)'  )
echo "Total run time in one year (days:hours:minutes)"
curr="1980-01-01T"$curr
org="1980-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"

1
কোনওভাবে আমি বাশ স্ক্রিপ্টগুলি পছন্দ করি তবে আমি জানি এখানে আরও মার্জিত উত্তরগুলি পাওয়া সম্ভব।
ankit7540

আপনার স্ক্রিপ্ট অনুসারে, আমি গত বছর 2258days, 01 ঘন্টা, 15 মিনিট অনলাইন ব্যয় করেছি।
daltonfury42

ত্রুটি ঠিক করা হয়েছে। কোডটি 8 টি লাইনে সংক্ষেপিত।
ankit7540

5

এখানে আমি কী চাই তার অজগর বাস্তবায়ন, তবে আমি নিশ্চিত যে ব্যাশ দিয়ে এটি করার একটি দুর্দান্ত উপায় আছে:

import subprocess
output = subprocess.run("last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'| sed -e 's/(//g; s/)//g; s/+/:/g'", shell=True, stdout=subprocess.PIPE, universal_newlines=True)
mins_total = 0

for line in output.stdout.split('\n')[:-1]:
    try:
        (hrs, mins) = [int(k) for k in line.split(':')]
        days = 0
    except:
        (days, hrs, mins) = [int(k) for k in line.split(':')]
    mins_total += (days*24 + hrs)*60 + mins

print("Hours: " + str(mins_total/60))
print("Days: " + str(mins_total/60/24))

3
"আমি নিশ্চিত বাশ দিয়ে এটি করার একটি দুর্দান্ত উপায় আছে" আইএমএইচও পাইথন আরও ভাল পছন্দ। বাশ ফাইলের ম্যানিপুলেশনের জন্য ভাল, গণনার জন্য নয়।
মেলিবিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.