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 を使う人は覚えておくと良いでしょう。




