termuxでタスクログ

termuxで mariadb を利用して、リストに挙げられたタスクの実行時刻を記録するスクリプトを書いてみました。termux-dialog のような、 termuxAPI も活用しています。

まずはメインとなる親スクリプトです。

#!/bin/bash
kill `pgrep mysqld`
mysqld&
sleep 1
bin_dir=$HOME/storage/shared/bin/delivery_log
. ${bin_dir}/set_path.sh
. createDB.sh
. select_course.sh
. set_station.sh
. free_input_termux.sh
. insertDB.sh
. create_rep.sh
kill `pgrep mysqld`

mariadb の二重起動を避けるために、まず kill してからバックグラウンドで起動しなおします。mariadb はオーバーヘッドに多少時間がかかるらしく、順調に進むとエラーが出るため sleep コマンドでタイミングを取りました。

#/bin/bash
# set_path.sh パスの設定
bin_dir=$HOME/storage/shared/bin/delivery_log
report_dir=$HOME/storage/shared/Documents/配送ログ
if [ -d "${bin_dir}" ]
then
	PATH="${bin_dir}:$HOME/bin:$PATH"
fi

# その他変数の設定
host=127.0.0.1

set_path.sh で PATH を始めとする幾つかの変数を設定します。シェル変数 bin_dir にディレクトリ中に全ての実行形式が入ってますので、set_path.sh 呼び出し以後は一々ディレクトリを指定しなくても実行形式が呼び出せます。変数 report_dir は最後にログを書き出すディレクトリの名称です。

#!/bin/bash
# createDB.sh データベーステーブルの作成
# コース名
mysql -h ${host} -u user delivery << _SQL_ 
 create table if not exists t_course (
  id int primary key auto_increment,
  コース varchar(10)
  );
_SQL_

# 駅名
mysql -h ${host} -u user delivery <<_SQL_
 create table if not exists t_station (
  id int primary key auto_increment,
  コース varchar(10),
  駅名 varchar(10),
  通常順 int
);
_SQL_

# カレンダーログ
mysql -h ${host} -u user delivery <<_SQL_
 create table if not exists t_log_convenient(
  id int primary key auto_increment,
  日付 date unique,
  コース varchar(10)
);
_SQL_

# 詳細ログ
mysql -h ${host} -u user delivery <<_SQL_
 create table if not exists t_log (
  id int primary key auto_increment,
  日付 date,
  駅名 varchar(10),
  時刻 time,
  東経 double,
  北緯 double,
  メモ varchar(100)
);
_SQL_

# 当日既に登録された駅名のビューを作成
mysql -h ${host} -u user delivery <<_SQL_
 create view if not exists v_通過済 as select 駅名 from t_log where 日付=date(now());
_SQL_

# 当日のコースに含まれる駅名のビューを作成(通常順0は大阪駅なので排除)
mysql -h ${host} -u user delivery <<_SQL_
create view if not exists v_コース as 
 select 駅名,通常順 from t_station s
 join 
 (select コース from t_log_convenient 
   where 日付=date(now())) t 
 on s.コース=t.コース where 通常順>0;
_SQL_

データベースを作成します。もちろん、1回作成してしまえば必要ありませんので、SQL文中の if not exists に従って何もせずに外へ出ます。

#!/bin/bash
# select_course.sh コースを選択します
today=`\ mysql -h ${host} -u user delivery -N << _SQL_ select * from t_log_convenient where 日付=date(now()); _SQL_` # 当日のコースが決まっていなければ if [ -z "${today}" ] then #### 本日のコースを設定します #### declare -a course_a=(`\ mysql -h ${host} -u user delivery -N << _SQL_ select コース from t_course; _SQL_` ) value=`echo ${course_a[*]} | sed -e "s/ /,/g"` line=`\ termux-dialog spinner -t "本日のコースを選択してください" -v "${value}" |\ tr "\n" " "` code=`echo ${line} | jq -r .code` if [ ${code} -eq -2 ]; then exit; fi course=`echo ${line} | jq -r .text` mysql -h ${host} -u user delivery << _SQL_ insert into t_log_convenient(日付,コース) values(date(now()), "${course}") on duplicate key update コース="${course}"; _SQL_ kill `pgrep mysqld` exit fi

既に当日のコースが決まっていれば変数 ${today} に値が入りますので、何もせずに外へ出ます。もし、値が無ければ if 文中でリストボックスダイアログを起動し当日のコースを t_course テーブル中から選択します。その結果は t_log_convenient テーブルに挿入されます。3つ目のSQL中、 on duplicate key 文で再挿入ではなく更新を掛けるように設定していますが、変数 ${today} に値が入りますから、このSQLに辿り着くことは無いでしょう。必ず mariadb を停止してから exit 文で親スクリプトごと終了します。

#!/bin/bash
### set_station.sh 通常順が最も若い駅名を返します ###
station=`\
mysql -h ${host} -u user delivery -N << _SQL_ 
 select c.駅名 from v_コース c left join v_通過済 p on c.駅名=p.駅名 
   where p.駅名 is null order by c.通常順 limit 1;
_SQL_`
if [ -z ${station} ]
then
 kill `pgrep mysqld`; exit
fi

テーブル t_log_convenient に当日のレコードが挿入されている、すなわち既に当日のコースが決まっていれば、このスクリプトにやってきます。既に訪れた駅はビュー v_通過済 に駅名が登録されますから、それ以外の駅名でかつ通常順が最も若い駅名が変数 ${statiaon} に返されます。ビュー v_コース に挙げられた駅を全て通過していた場合は、該当するレコードが存在しませんから、${station} に値は入りません。そのため mariadb をkillして親スクリプトごと終了します。

#!/bin/bash
line=`\
  termux-dialog text -t "${station}駅" -i "メモを自由に入力して下さい" |\
  tr "\n" " "`
code=`echo ${line} | jq -r .code`
if [ ${code} -eq -1 ]
then
 input=`echo ${line} | jq -r .text`
else
 kill `pgrep mysqld`
 exit
fi

テキストダイアログを起動し、メモを自由入力します。何も書かなくても構いません。このOKボタンを押した瞬間がタスク実行時刻となります。自由入力されたメモは変数 ${input} に返されます。

f:id:S_E_Hyphen:20211127153813j:plain
#!/bin/bash
# insertDB.sh テーブルにログを入力します
. time_set.sh
. location_set.sh

insertDB.sh はOKボタンが押されたときにするジョブです。location_set.sh はスマホGPS機能を使用して位置情報を取りに行くスクリプトですが、絶対必要というわけでもありませんので詳細は割愛します。

#!/bin/bash
# time_set.sh ログに駅名、日付、時刻、メモを挿入します key=`\ mysql -h ${host} -u user delivery -N << _SQL_ insert into t_log(駅名,日付,時刻,メモ) values("${station}",date(now()),time(now()),"${input}"); select last_insert_id(); _SQL_`

テーブル t_log に必要な情報を挿入します。最後に create_rep.sh で所望のディレクトリにレポートファイルを出力します。

#!/bin/bash
month=`date +"%m"`
day=`date +"%d"`
course=`\
mysql -h ${host} -u user delivery -N << _SQL_
select コース from t_log_convenient 
   where 日付=date(now());
_SQL_`
repfile=${report_dir}/${month}月${day}日${course}.html

temp=`mktemp ./XXX`
mysql -h ${host} -u user delivery -N << _SQL_ > ${temp}
 select 駅名,時刻,メモ,北緯,東経 from t_log
   where 日付=date(now());
_SQL_

cat << _HEADER_ > ${repfile}
<html>
  <head>
    <meta charset="UTF-8">
    <style type="text/css">
    h3 { margin-left:60%; font-size:16pt; font-family: serif }
    table { page-break-inside:auto; margin-left:15%; font-size:16pt}
    th { background-color: #ccc; }  
    tr { page-break-inside:avoid; page-break-after:auto } 
   </style>
  </head>
 <body>
  <table border="1px" width="70%" >
  <caption><span style="font-size: 120%;">${month}月${day}日 ${course}コースのタスク実行時刻</span></caption>
  <meta http-equiv="content-type" charset="utf-8">
  <tr>
  <th width="30%">駅名</th>
  <th width="20%">時刻</th>
  <th width="30%"> 備考</th>
  <th width="10%"> 北緯</th>
  <th width="10%"> 東経</th>
  </tr>
_HEADER_

cat ${temp} |\
 awk -F"\t" --assign line="$line" \
      '{printf "  <tr valign=\"top\">\n"} \
       {printf "  <td align=\"center\">%s</td>\n",$1} \
       {printf "  <td align=\"center\" style=\"font-size:100%;\">%s</td>\n",$2} \
       {printf "  <td align=\"left\" style=\"font-size:100%;\">%s</td>\n",$3} \
       {printf "  <td align=\"left\" style=\"font-size:60%;\">%s</td>\n",$4} \
       {printf "  <td align=\"left\" style=\"font-size:60%;\">%s</td>\n",$5} \
       {printf "  </tr>\n"}' >> ${repfile}

cat << _FOOTER_ >> ${repfile}
</table>
<h3>
以上、御報告申し上げます。<BR>
  担当者 安倍晴明<BR></h3>
</body></html>
_FOOTER_

rm ${temp}

 

11月26日 東京コースのタスク実行時刻
駅名 時刻 備考 北緯 東経
新大阪 14:54:00 出発 NULL NULL
彦根 15:33:20 備忘録を残します NULL NUL
名古屋 16:02:50 通過時刻 NULL NULL
静岡 17:25:00   NULL NULL
小田原 18:14:00 実行時刻 NULL NULL
東京 18:48:30 終了時刻 NULL NULL