1. はじめに
OL8上にインストールした jupyter notebook で作成した python プログラムを cron 登録し、自動実行させます。
前提条件
https://qiita.com/twakimura/items/e2b145e2460c388ba0cc
この記事を参考に Compute インスタンス上に jupyter notebook を導入しています。
2. コードの作成
ここでは、TESTテーブルの主キーをカウントアップした値とpython実行時に渡された引数を挿入する処理を記載しています。
プログラムに渡される引数は sys.argv[n] で取得できます。
import os
import sys
import pandas as pd
from sqlalchemy import create_engine
# 引数チェック、引数が設定されていないとエラーとする。
try:
param1 = sys.argv[1] # パラメータ1
except IndexError:
print("Error: You must provide one parameter.")
sys.exit(1)
# oracledb接続情報の取得
un = os.environ.get('ORAUSER')
pw = os.environ.get('ORAPASS')
cs = os.environ.get('ORATNS')
wallet_dir = os.environ.get('TNS_ADMIN')
wallet_pw = os.environ.get('WALLETPASS')
# SQLAlchemyエンジンを作成
engine = create_engine(f'oracle+oracledb://{un}:{pw}@{cs}', connect_args={
"config_dir": wallet_dir,
"wallet_location": wallet_dir,
"wallet_password": wallet_pw
})
# DB接続処理
with engine.connect() as conn:
# 主キーの最大値をカウントアップして挿入キーにする
query = "SELECT MAX(TESTNO) FROM TEST"
df = pd.read_sql(query, con=conn)
new_testno = df.loc[0, 'MAX(TESTNO)'] + 1
# TESTNAMEには引数で渡された値を設定する。
list = [[new_testno,param1]]
df = pd.DataFrame(list, columns=["TESTNO", "TESTNAME"])
# 既存のテーブルにデータを追加
df.to_sql('test', con=engine, if_exists='append', index=False)
# 接続を閉じる
engine.dispose()
3. .pyファイルの作成
jupyter notebook で作成した .ipynb ファイルを linux のコマンドライン上で実行できるように .py ファイルに変換します。
$ jupyter nbconvert --to script batch.ipynb
[NbConvertApp] Converting notebook batch.ipynb to script
[NbConvertApp] Writing 1131 bytes to batch.py
$ ls -l batch.*
-rw-r--r--. 1 oracle oinstall 3451 Dec 9 10:42 batch.ipynb
-rw-r--r--. 1 oracle oinstall 1349 Dec 9 10:50 batch.py
.py ファイルが作成されました。
実行は以下でできます。
$ python batch.py Test3
データが格納されたことを確認します。
SQL> select * from TEST;
TESTNO TESTNAME
---------- --------------
3 Test3
1 テスト1
2 テスト2
SQL>
4. cron登録
定期的に実行するバッチ処理はcronに登録して実行しますが、上記の .py ファイル実行コマンドをそのままcron登録してもうまく動きません。
cron実行時はユーザーのbash_profile等が考慮されないためです。
そのため、シェルファイルを作成し、その中で環境変数の読込や実行ディレクトリ指定、.py の実行を記載します。
cronの検証として毎分実行するようにしますので、引数には実行時の時間を渡して確認するようにしました。
#!/bin/bash
# 環境変数の読込
source ~/.bashrc
# 実行ディレクトリに移動(相対パスの記載がある場合は必要)
cd ~/python
# batch.pyの実行
python batch.py "$(date '+%T')"
作成したシェルには実行権限を付けておきましょう。
シェルの準備ができたらcron登録します。
$ crontab -e
* * * * * ~/sh/run_batch.sh >> ~/log/run_batch.log 2>&1
数分たったらcronの設定を#でコメントアウトして停止します。
データが格納されたことを確認します。
SQL> select * from TEST;
TESTNO TESTNAME
---------- --------------
3 Test3
1 テスト1
2 テスト2
4 01:52:01
5 01:53:02
SQL>
これで jupyter notebook で作成した python プログラムを自動実行することができました。