工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:bash

概要

gatttoolのインタラクティブモードにコマンドを流し込み(=パイプを利用)、任意のタイミングで終了させる方法を試し、動作を確認した。


背景と目的

以前、gatttoolのインタラクティブモードに無理やりコマンドを流し込み(=パイプを利用)、ノンインタラクティブのように動かしたが、sleepで決まった秒数経った後に終了することしかできていなかった。そこで、任意のタイミングで終了させられるようにする。


詳細

1.方法

以前作成したgattcommand.shというスクリプトを改造。test_gatt.shは変更なし。

  • まず、スイッチの役割をするファイルfile1を用意する。file1には、0か1が書き込まれるとする。
  • 次に、gattcommand.shでは、file1に1を書き込む
  • そして、file1の中身が1の間はwhileループでスリープをし続けるようにする。
  • whileループを抜け、Bluetoothの接続を切り、インタラクティブモードから抜けるexitを出力する

としておく。こうすることで、任意のタイミングでfile1に0を書き込めば、gatttoolを終了させられる。


2.実装

gattcommand.shを改造した結果は、以下の通り。


echo "1" >switch

sleep 1
echo connect

while [ `cat switch` = "1" ]
do
  sleep 1
done

echo disconnect
echo exit

3.動作確認

sudo bash test_gatt.sh &

でgatttoolのインタラクティブモードを起動。次に、任意のタイミングで、

echo "0" >file1

を実行。すると、インタラクティブモードが終了した。ということで、狙い通りの動きになった。

まとめ

gatttoolのインタラクティブモードにコマンドを流し込み(=パイプを利用)、任意のタイミングで終了させることができた。これを応用すれば、任意のタイミングで、任意のコマンドを流し込めそうだ。

概要

 エラー内容に時刻を付加してファイル出力するシェルスクリプトを作成し、動作を確認した。


背景と目的

 ラズパイをいじっていて、エラー内容を時刻付きで記録しておきたかったのだが、シェルスクリプトでの書き方が分からなくていろいろ調べてやっとわかった。そこで、忘れないようにメモっておく。


詳細

1.やりたいこと
  • 実行したいコマンドの実行結果(標準出力)をsuccess.txtに上書き
  • 実行したいコマンドがエラーの時、その内容の先頭に時刻文字列を付加して、error.txtに追記
2.実装

 実行したいコマンドはここではテストのため、dirとする。引数に、フィルタリングのための文字列xを与える。xを含むファイルやディレクトリが見つからないときは、エラーになる。

dir x

 先頭に時刻を付加するには、sedコマンドを利用。以下は、先頭に、2017-01-03 16:11:05のような現在時刻が挿入される。

sed -e "s/^/`date "+%Y-%m-%d %H:%M:%S"`\n/g"

 あるコマンドcommand1のエラーをあるコマンドcommand2にパイプで渡すには、こちらを参考にすると、以下の通り。

command1 2>&1 | command2

 以上より、出来上がったものは以下。スクリプトにして使おうと思うので、第一引数でdirの引数が与えられるように$1となっている。

dir $1 2>&1 > success.txt | sed -e "s/^/`date "+%Y-%m-%d %H:%M:%S"`\n/g" >> error.txt
3.確認

 テスト用のコマンドは以下。

sudo bash test.sh # 正常時
sudo bash test.sh *.aaa # 拡張子aaaを含むファイルがないので、エラー

 これらを実行したところ、success.txtには、正常に結果が出力された。一方、error.txtは以下の通りちゃんと時刻が付加された。(何回か実行して追記されているのを確認)

2017-01-03 15:59:28
dir: *.aaa にアクセスできません: そのようなファイルやディレクトリはありません
2017-01-03 15:59:29
dir: *.aaa にアクセスできません: そのようなファイルやディレクトリはありません
:

まとめと今後の課題

 エラー内容に時刻を付加してファイル出力するシェルスクリプトを作成し、動作を確認できた。

このページのトップヘ