Linux 'w'コマンド、アイドル時間(秒)を取得する

Linux 'w'コマンド、アイドル時間(秒)を取得する

すべてのユーザーのアイドル時間を秒単位(分または日単位ではない)として取得する必要があります。どうすればいいですか?このコマンドは、接続されているすべてのユーザーのアイドル時間をリストします。

w | awk '{if (NR!=1) {print $1,$5 }}'

出力:

USER IDLE
root 4:29m
root 105days
root 2days
root 10:49m
root 7.00s
root 4:27m

仕事と分を秒に変換するには?

答え1

アイドル時間は、ユーザーがログインしたTTYデバイスの最後のアクセス時間よりも複雑ではありません。したがって、簡単なアプローチは、人々がログインしているすべてのTTY名を取得し、次のことを行うことですstat

who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X')

一部のシステムでは、ログインセッション(実際のttyにないX11セッション)に対してエラーが発生します。

絶対時間の代わりに年齢が必要な場合は、後処理して現在の時間から減算してください。

who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X') |
    awk '{ print $1"\t"$2"\t"'"$(date +%s)"'-$3 }'

またはperl'演算子を使用してください-A

who -s | perl -lane 'print "$F[1]\t$F[0]\t" . 86400 * -A "/dev/$F[1]"'

答え2

これは最もエレガントなコードではなく、短縮されるかもしれませんが、これは宿題のためのものです:-)

w |awk '{
if (NR!=1){ 
if($5 ~ /days/){ 
    split($5,d,"days");
    print $1,d[1]*86400" sec"
}
else if( $5 ~ /:|s/){
    if ($5 ~/s/) { sub(/s/,"",$5); split($5,s,"."); print $1,s[1]" sec" }
    else if ( $5 ~/m/) { split($5,m,":"); print $1,(m[1]*60+m[2])*60" sec" }
    else { split($5,m,":"); print $1,m[1]*60+m[2]" sec" }
}
else { print $1,$5}
}}'

答え3

bashソリューションは次のとおりです。

WishSeconds () {

    # PARM 1: 'w -ish' command idle time 44.00s, 5:10, 1:28m, 3days, etc.
    #      2: Variable name (no $ is used) to receive idle time in seconds

    # NOTE: Idle time resets to zero when user types something in terminal.
    #       A looping job calling a command doesn't reset idle time.

    local Wish Unit1 Unit2
    Wish="$1"
    declare -n Seconds=$2

    # Leading 0 is considered octal value in bash. Change ':09' to ':9'
    Wish="${Wish/:0/:}"

    if [[ "$Wish" == *"days"* ]] ; then
        Unit1="${Wish%%days*}"
        Seconds=$(( Unit1 * 86400 ))
    elif [[ "$Wish" == *"m"* ]] ; then
        Unit1="${Wish%%m*}"
        Unit2="${Unit1##*:}"
        Unit1="${Unit1%%:*}"
        Seconds=$(( (Unit1 * 3600) + (Unit2 * 60) ))
    elif [[ "$Wish" == *"s"* ]] ; then
        Seconds="${Wish%%.*}"
    else
        Unit1="${Wish%%:*}"
        Unit2="${Wish##*:}"
        Seconds=$(( (Unit1 * 60) + Unit2 ))
    fi

} # WishSeconds

WishSeconds "20days" Days ; echo Passing 20days: $Days
WishSeconds "1:10m"  Hours ; echo Passing 1:10m: $Hours
WishSeconds "1:30"   Mins ; echo Passing 1:30: $Mins
WishSeconds "44.20s" Secs ; echo Passing 44.20s: $Secs

結果

Passing 20days: 1728000
Passing 1:10m: 4200
Passing 1:30: 90
Passing 44.20s: 44

関連情報