uptime/tuptime クエリ

uptime/tuptime クエリ

私のumpcはサスペンド/休止状態をうまく処理できないため、一定時間アイドル状態になった後にシャットダウンするスクリプトを作成する必要がありました。

メインスクリプト:

#!/bin/bash

idletime=$((15*60*1000)) # 15 min in milliseconds 
#idletime=$((5*20*330)) # about one minute, for testing 
idle=0
while [ $idle -lt $idletime ];do     
    idle=`xprintidle` 
    sleep 1 
done 
/home/jake/Scripts_Icons/Word_Shutdown 
sleep 2 
sudo shutdown -P now

スクリプトWord_Shutdown

#!/bin/bash 

if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then      
    wmctrl -a "Microsoft Word"     
    sleep .2     
    xdotool keydown 0xffea + key 4     
    sleep .2     
    xdotool keyup 0xffea     
    sleep .2    
    xdotool key y 
fi

動作しますが、バッテリー寿命を適切に監視するために、1 回のバッテリー充電でのセッション中の稼働時間を 1 つの稼働時間にまとめたいと思います。

それは可能ですか?tuptime前のセッションの稼働時間を表示し、現在のセッションの稼働時間の監視を開始するようです。これらの出力を 1 つの読み取り値に結合する方法はありますか3hr 4 min?

コマンドtuptime出力:

[jake@P3 ~]$  sudo tuptime -S 2 
System startups:    8  since  06:14:53 PM 06/20/2022 
System shutdowns:   0 ok  +  7 bad 
System life:            17h 50m 4s  

System uptime:          16.15%  =  2h 52m 46s 
System downtime:    83.85%  =  14h 57m 18s  

Average uptime:     21m 36s 
Average downtime:   2h 8m 11s  

Current uptime:     2h 9m 1s  since  09:55:56 AM 06/21/2022

「システム稼働時間」は、シャットダウン間のすべての稼働時間を結合しているようです。

私が試してみました:

tuptime | awk -F'=' '/System uptime:/ {print $2}'

動作しますが、秒と先頭のスペースも出力されます2h 52m 46s。秒と先頭の空白を削除して、時間と分だけを残す方法はありますか2h 52m?

それとも、uptime同様に揺らすことができるハンドルがそれ自体にあるのでしょうか?

答え1

機能するが、バッテリー寿命を適切に監視するために1 回のバッテリー充電でのセッション中の稼働時間を 1 つの稼働時間にまとめたいと思います。

バッテリー寿命を適切に監視するには:

  • 次のようにしてバッテリーのデバイス参照(名前)を特定しますupower -e

    upower -e | grep -i "batt"
    
  • upower -i次のように、バッテリーの参照 (名前) を使用してバッテリー情報を取得します。

    upower -i /org/freedesktop/UPower/devices/battery_BAT0
    
  • 出力をupower -i絞り込んで、そのようです:

    awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
    
  • 出力をupower -i絞り込んで、パーセンテージ「%」なしで次のようにします:

    awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0)
    
  • # Your shutdown command here上記の知識を、バッテリーの充電時に5分ごとにシャットダウンコマンド(実際のコマンドに置き換えてください)を実行するスクリプトで使用します。8%以下に達するそれは放電状態そのようです:

#!/bin/bash

while true; do
    state="$(awk '/state:/ {print $2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0))"
    percentage="$(awk '/percentage:/ {print 0+$2}' <(upower -i /org/freedesktop/UPower/devices/battery_BAT0))"
    [ "$state" == "discharging" ] && [ "$percentage" -le "8" ] && # Your shutdown command here
    sleep 300
done

私のumpcはサスペンド/休止状態をうまく処理できないため、一定時間アイドル状態になった後にシャットダウンするスクリプトを作成する必要がありました。

メインスクリプト:

#!/bin/bash ...

  • メイン スクリプトでは、コマンド置換にバック ティック `...` を使用します。

    idle=`xprintidle`
    

    引き続き動作しますが、コマンド置換のバックティックはレガシー機能と見なされます(古いため将来廃止される可能性があります) なので、$(...)代わりに次のように使用することをお勧めします。

    idle=$(xprintidle)
    
  • このような重要でないタスクには通話時間が短すぎます... そのため、次のように数秒または 1 分sleep 1に延長することをお勧めします。30

    sleep 1m
    

スクリプトWord_Shutdown

#!/bin/bash ...

  • スクリプトWord_Shutdownのこの部分には 2 つの問題があります。

    if test $(wmctrl -l | grep "Microsoft Word" 2>&1 | wc -l) -eq 1; then
    

    grep "Microsoft Word" 2>&1 | wc -lまず、 ...を使用する必要はありませんgrep -c "Microsoft Word" 2>&1。同じ結果が出力されます。

    次に、評価部分で直接使用されるコマンド置換を引用符で囲み、if次のように単語の分割を防ぎます。

    if test "$(wmctrl -l | grep -c "Microsoft Word" 2>&1)" -eq 1; then
    

私が試してみました:

tuptime | awk -F'=' '/System uptime:/ {print $2}'

動作しますが、秒と先頭のスペースも出力されます
2h 52m 46s。秒と先頭の空白を削除して、時間と分だけを残す方法はありますか2h 52m?

はい、さらに優れた将来性のある方法(例: System uptime3 つ以上のフィールドが含まれている場合4d 22h 31m 54s)は次のようになります。

tuptime | awk '/System uptime:/  {for (i=1; i < NF; i++) {if (i > 4) {if (i < (NF - 1)) printf("%s ", $i); else print $i}}}'

「システム稼働時間」は、シャットダウン間のすべての稼働時間を結合しているようです。

それは正しいです。

それとも、稼働時間自体にも同様に調整できるハンドルがあるのでしょうか?

おそらく、この-sオプションはあなたの場合に便利になるでしょう...男のタップタイム:

-s| --seconds 時間を秒とエポックで出力します

答え2

Tuptime はレポートの範囲を狭める可能性があります。現在のものと前のものだけが必要な場合は、 を使用してtuptime -S -1、テーブル出力で正しいかどうかを確認します-t

両方の稼働時間を一緒に計算するには、次のようにします。

tuptime -S -1 --csv | grep 'System uptime' | cut -d\" -f6 | awk -F\m '{print $1"m"}'

Tuptime csv 出力を使用して簡単に解析し、ターゲット行を一致させ、フィールドを切り取って、「m」の前のテキストを抽出します。

関連情報