はじめに、curl コマンドでレスポンスタイムを取得しようとした。
$ TARGET_URL=https://www.google.com/
$ curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n"
0.308898
問題なく動作した。
次にそれを3秒間隔で実行しようと while を使った。
$ while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n"; sleep 3s; done
0.370663
0.374432
0.929187
これも問題なく動作した。
次に出力を output.log にリダイレクトしようとした。
$ while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n" >> output.log; sleep 3s; done
$ tail -f output.log
0.361946
0.413211
0.952241
問題なくリダイレクトされている。
次に nohup をつけてログアウト後も処理を継続しようとした。
$ nohup while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n" >> output.log; sleep 3s; done &
bash: syntax error near unexpected token `do'
これはエラーになって動作しない。
別の bash プロセス上で起動する必要がある。
$ nohup bash -c 'while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n" >> output.log; sleep 3s; done' &
$ tail -f nohup.out
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
しかしながら、no URL specified と言われてしまう。
別の bash プロセス上で起動しているため、元のシェル変数${TARGET_URL} が見えなくなってしまっている。
そこで環境変数として定義しなおしてみる。
$ export TARGET_URL=https://www.google.com
$ nohup bash -c 'while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n" >> output.log; sleep 3s; done' &
$ tail -f output.log
0.361946
0.413211
0.952241
問題なく出力することができる。
もし、環境変数として定義したくない場合は、実行するコマンドの最初にシェル変数を定義してあげる。
$ nohup bash -c 'TARGET_URL=https://www.google.com/; while true; do curl ${TARGET_URL} -s -o /dev/null -w "%{time_starttransfer}\n" >> output.log; sleep 3s; done' &