watch コマンドのようなもの

watchコマンドを作ってみた - みずぴー日記 にインスパイヤされて awk でも実装してみます。 待っている間は system() 関数から sleep コマンドを呼び出しているのですが、CTRL+C でなかなか止められないので、AWK Users JP :: awk でテトリスみたいなゲームをつくろう! (嘘) で使ったものを使って "q" キーを押せば止まるようにしてみました。

ただし、実際には "q" キーを押すタイミングが難しく、微妙な実装になっています。

#! /usr/local/bin/nawk -f
# watch.awk
# watch コマンドのようなもの
# usage: nawk -f watch.awk cmd

BEGIN {
    Watch_Cmd   = ARGV[1];
    Sleep_Cmd   = "/bin/sleep";
    Sleep_Opt   = "2";
    Sleep_Exec  = Sleep_Cmd " " Sleep_Opt;
    Clear_Exec  = "echo -n '\033[H\033[2J'";    # 画面消去
    Get_Key_Exec    = "stty -icanon min 1 ; "\
                      "((while :; do echo '~'; sleep 1; done) &"\
                      "(while :; do echo `dd bs=1 count=1`; done))"\
                      " 2> /dev/null";          # 入力を取得

    for (;;) {
        Get_Key_Exec | getline;

        if ($1 == "q") {
            exit;
        }

        if ($1 == "~") {
            system(Clear_Exec);
            print "Every " sprintf("%.1f", Sleep_Opt) "s";
            system(Watch_Cmd);
        }

        system(Sleep_Exec);
    }
}

awk はタイムアウトのようなものや、バックグラウンドでの並列動作のようなことができませんので、一部を Shell に任せています。

使い方は以下のように実行します。

$ nawk -f watch.awk 'top -n 1'
Every 2.0s
top - 00:04:47 up 16:31,  3 users,  load average: 1.45, 1.53, 1.51
Tasks: 232 total,   3 running, 228 sleeping,   1 stopped,   0 zombie
Cpu(s):  4.1%us,  5.2%sy, 40.4%ni, 48.8%id,  1.4%wa,  0.1%hi,  0.0%si,  0.0%st
Mem:   2021136k total,  1894960k used,   126176k free,    40832k buffers
Swap:  4063224k total,        0k used,  4063224k free,  1083392k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2502 boinc     39  19 50364  45m 1364 R 41.3  2.3 423:50.87 astropulse_5.06
11053 boinc     39  19 51216  44m  496 R 31.5  2.3 146:56.24 wcg_hcc1_img_6.
12304 hi_saito  20   0 44240  10m 8364 S  3.9  0.5   8:31.29 gkrellm
26206 root      20   0  467m  72m  49m S  3.9  3.7  14:48.42 Xorg
13652 hi_saito  20   0 84480  22m  12m S  2.0  1.1   0:05.31 /usr/bin/termin
15725 hi_saito  20   0  432m 212m  24m S  2.0 10.8  25:09.06 firefox
30317 hi_saito  20   0  2544 1064  748 R  2.0  0.1   0:00.01 top
    1 root      20   0  2008  696  484 S  0.0  0.0   0:00.76 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S  0.0  0.0   0:00.07 migration/0
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.74 ksoftirqd/0
    5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    6 root      RT  -5     0    0    0 S  0.0  0.0   0:00.06 migration/1
    7 root      15  -5     0    0    0 S  0.0  0.0   0:00.49 ksoftirqd/1
    8 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1
    9 root      15  -5     0    0    0 S  0.0  0.0   0:00.18 events/0
   10 root      15  -5     0    0    0 S  0.0  0.0   0:00.10 events/1
   11 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 cpuset

watch コマンドは何かと便利なので、Linux を使う人は覚えておくと良いでしょう。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png