How to spend the terminal

技術ブログでさえない

Windowsでuptimeコマンドもどき(Go言語)

Windowsで稼働時間を確認する方法としてコマンドプロンプトでの"net statistics server"やタスクマネージャなどがあります。
しかし、"net statistics server"で得られる情報は開始日時で稼働時間を得るには計算がいりますし、タスクマネージャは起動しなければいけません。
そのためにコマンドラインで稼働時間を取得するためにGo言語でuptimeもどきを作りました。ロードアベレージを取得するには前もって用意していないと駄目で、ユーザ数を取得するWin32 APIは知らないので現在時刻と稼働時間のみ出力します。

package main

import (
	"fmt"
	"log"
	"os"
	"syscall"
	"time"
)

func main() {
	dll, err := syscall.LoadDLL("Kernel32.dll")
	if err != nil {
		log.Fatal(err)
	}
	defer dll.Release()

	proc, err := dll.FindProc("GetTickCount64")
	if err != nil {
		log.Fatal(err)
	}

	tcP, _, lastErr := proc.Call()
	lastErr = syscall.GetLastError()
	if lastErr != nil {
		log.Fatal(lastErr)
	}
	tc := (uint64)(tcP)
	sec := tc / 1000
	min := sec / 60
	hour := min / 60
	day := hour / 24
	hour %= 24
	min %= 60
	var up string
	if day > 0 {
		if day > 1 {
			up = fmt.Sprintf("up %d days, %02d:%02d", day, hour, min)
		} else {
			up = fmt.Sprintf("up %d day, %02d:%02d", day, hour, min)
		}
	} else if hour > 0 {
		up = fmt.Sprintf("up  %02d:%02d", hour, min)
	} else {
		up = fmt.Sprintf("up  %d min", min)
	}

	t := time.Now()
	now := fmt.Sprintf("%02d:%02d:%02d", t.Hour(), t.Minute(), t.Second())

	fmt.Fprintf(os.Stdout, " %s %s\n", now, up)
}

実行結果は次のようになります。XPの場合、GetTickCount64がないのでGetTickCountを使ってtcのキャストをuint32にしてください。
f:id:moxtsuan:20170630134706p:plain

長い時間稼働させると何が起こるかわからないので定期的に再起動は行いましょう。