137 lines
2.8 KiB
Markdown
137 lines
2.8 KiB
Markdown
|
+++
|
||
|
date = "2021-01-19"
|
||
|
tags = ["mac","shell"]
|
||
|
title = "macでtimeコマンドを使ってみる"
|
||
|
slug = "shell"
|
||
|
+++
|
||
|
|
||
|
`coreutils`になかったのですが、`gnu-time`でインストールできます。
|
||
|
|
||
|
mac標準は、`/usr/bin/time`にありますが、ほとんどのオプションが機能せず、あまり使えません。
|
||
|
|
||
|
```sh
|
||
|
$ brew install gnu-time
|
||
|
$ gtime -f "%e" read
|
||
|
```
|
||
|
|
||
|
これによって、ストップウォッチとして使えますし、任意のタイミングで実行時間を計測して記録できるので、色々と便利です。
|
||
|
|
||
|
例えば、任意のコマンドを指定した間隔で実行してみます。
|
||
|
|
||
|
```sh
|
||
|
#/bin/zsh
|
||
|
time=time.txt
|
||
|
json=command.json
|
||
|
echo "[s]ave, [l]oad"
|
||
|
case $1 in
|
||
|
s)
|
||
|
if [ -f $json ];then
|
||
|
rm $json
|
||
|
fi
|
||
|
echo "[" >> $json
|
||
|
while :
|
||
|
do
|
||
|
echo "command?, [s]top"
|
||
|
read key
|
||
|
case $key in
|
||
|
s)
|
||
|
echo "{\"command\":\"\",\"time\":\"\"}]" >> $json
|
||
|
exit
|
||
|
;;
|
||
|
*)
|
||
|
echo "time enter"
|
||
|
gtime -f "%e" -o $time read
|
||
|
cti=`cat $time`
|
||
|
echo "{\"command\":\"$key\",\"time\":\"$cti\"}," >> $json
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
;;
|
||
|
l)
|
||
|
if ! cat $json|jq;then
|
||
|
exit
|
||
|
fi
|
||
|
n=`cat $json|jq length`
|
||
|
n=$((n - 2))
|
||
|
for ((i=0;i<=$n;i++))
|
||
|
do
|
||
|
command=`cat $json|jq -r ".[$i].command"`
|
||
|
time=`cat $json|jq -r ".[$i].time"`
|
||
|
zsh -c "$command"
|
||
|
sleep $time
|
||
|
done
|
||
|
;;
|
||
|
esac
|
||
|
```
|
||
|
|
||
|
例えば、このスクリプトを`command.zsh`で保存したとして、`ls`, `which cat`を一定の時間間隔で実行してみます。
|
||
|
|
||
|
```sh
|
||
|
$ mkdir -p ./tmp
|
||
|
$ cd ./tmp
|
||
|
$ chmod +x command.zsh
|
||
|
|
||
|
# まずは処理を保存します
|
||
|
# 時間間隔も保存しますので、`time enter`のところで任意のタイミングでetnerを押し、記録します
|
||
|
$ ./command.zsh s
|
||
|
[s]ave, [l]oad
|
||
|
command?, [s]top
|
||
|
ls
|
||
|
time enter
|
||
|
|
||
|
command?, [s]top
|
||
|
which cat
|
||
|
time enter
|
||
|
|
||
|
command?, [s]top
|
||
|
s
|
||
|
|
||
|
# 呼び出してみます
|
||
|
$ ./command.zsh l
|
||
|
[
|
||
|
{
|
||
|
"command": "ls",
|
||
|
"time": "5.63"
|
||
|
},
|
||
|
{
|
||
|
"command": "which cat",
|
||
|
"time": "7.08"
|
||
|
},
|
||
|
{
|
||
|
"command": "",
|
||
|
"time": ""
|
||
|
}
|
||
|
]
|
||
|
command.json command.zsh time.txt
|
||
|
/bin/cat
|
||
|
```
|
||
|
|
||
|
指定したコマンドが記録された間隔で実行されました。
|
||
|
|
||
|
もし永続化したいなら、`zsh repeat`を使うか、新しいオプションを付けてみてください。
|
||
|
|
||
|
```sh
|
||
|
ll)
|
||
|
if ! cat $json|jq;then
|
||
|
exit
|
||
|
fi
|
||
|
n=`cat $json|jq length`
|
||
|
n=$((n - 2))
|
||
|
while :
|
||
|
do
|
||
|
for ((i=0;i<=$n;i++))
|
||
|
do
|
||
|
command=`cat $json|jq -r ".[$i].command"`
|
||
|
time=`cat $json|jq -r ".[$i].time"`
|
||
|
zsh -c "$command"
|
||
|
sleep $time
|
||
|
done
|
||
|
done
|
||
|
;;
|
||
|
```
|
||
|
|
||
|
ちなみに、こういうのもあるらしいので、`gtime`に当ててやると、時間が測りやすいと思います。(面倒なのでやらないけど
|
||
|
|
||
|
https://raw.githubusercontent.com/coryfklein/sw/master/sw
|
||
|
|