Linux でよく使うコマンド nohup
TeraTermでSRVにつないでバッチ実行とかしてる時、気付くとWindowsがスタンバイになり、TeraTermがセッションタイムアウトになって、バッチも止まってるとか、よくあるやつ。
3分に一回マウスを動かします。。。
みたいな事をしなくてよくなるコマンド
nohup
実行したいバッチやコマンドをnohupコマンドの引数で渡してあげると、TeraTermが落ちても裏でhupが送られず、処理が継続される優れものです。
>nohup /home/001/hogehoge.sh
これで、帰る前にバッチ実行して翌朝出社すると、処理が完了している!みたいな運用可。
なお、nohupで渡したコマンド/シェルの結果(標準出力)は、nohupコマンドを実行した場所 or 実行ユーザのホームDIRに、 nohup.out っていうファイルが作成されて、そこに記載されています。
また、mailも届くの実行したユーザでログインしなおして、mailを確認するでもよしです。
Linux でよく使うコマンド at
最近 AWSにリフトアップするSRVの性能試験のために、大量処理実行バッチを作って、新旧環境で処理時間測定をした時に覚えた、便利コマンド。
at
コマンドやシェルを1回限りの時間指定実行できるコマンドです。
cronを使わなくても自動実行できるので、今回みたいに1回だけシェルを流したいときに重宝。
>at 10:00 06012020 at > echo 'It's 10 o'clock'
atコマンドの続いて実行したい日時を HH:MMとMMDDYYYY で指定します。
Enterを押下すると、実行したいコマンドを指定するようになるので、コマンドを登録します。
複数登録可。
登録がすんだら、ctl + D でセーブ。
ちゃんと登録できたか確認するには、
>at -l
で確認します。
また、バッチを登録したい場合は、-f オプションで。
>at 10:00 06012020 -f /home/001/hogehoge.sh
と登録するか、
>at 10:00 06012020 at> /home/001/hogehoge.sh
で登録します。
実行権付け忘れにご注意を。
python + Flask + MySQL insertやらupdateやらで変数を渡す
基本的なところだけど、一から始めると意外とわからないシリーズ。
python + flask + MySQLでSELECTは簡単に実現できました。
で次は、pythonでこねこねした後のデータをaddしてINSERTしたいするやつ。
conn_dbは毎回共通のMySQL接続定義。
本体のINSERTで、%s で変数を渡します。
from flask import Flask import mysql.connector #DB接続情報 def conn_db(): conn = mysql.connector.connect( host = '127.0.0.1', #localhostでもOK user = 'localadmin', passwd = 'passwd', db = 'sample' ) return conn #本体 item = 'ぶどぅ' price = '498' stock_num = '80' try: conn = conn_db() #ここでDBに接続 cursor = conn.cursor() #カーソルを取得 cursor.execute("INSERT INTO raw_data VALUES(%s,%s,%s)",(item, price, stock_num)) except(mysql.connector.errors.ProgrammingError) as e: print('エラーだぜ') print(e) #commit conn.commit()
python + Flask で MySQLに接続
python + flaskでMySQLにつなぐために、今回は mysql-connector-python を使っていきます。
これを選んだ理由は、他の方法でうまくいかなかったから。
あと、接続情報がぱっと見で見やすかったら、後からini化しやすいなぁと思ったので。
まずは、pipってmysql-connector-pythonを追加します。
>pip install mysql-connector-python
で本体はこんな感じで書きます。
ちなみにMySQL側はこんな感じで初期設定している前提で。
テーブル構成とデータ
python.py
from flask import Flask import mysql.connector #DB接続情報 def conn_db(): conn = mysql.connector.connect( host = '127.0.0.1', #localhostでもOK user = 'localadmin', passwd = 'passwd', db = 'sample' ) return conn #本体 sql = 'SELECT * FROM sample' try: conn = conn_db() #ここでDBに接続 cursor = conn.cursor() #カーソルを取得 cursor.execute(sql) #selectを投げる rows = cursor.fetchall() #selectの結果を全件タプルに格納 except(mysql.connector.errors.ProgrammingError) as e: print('エラーだぜ') print(e) print('select結果だぜ') for t_rows in rows: print(t_rows[0], t_rows[1], t_rows[2]) #selectの結果を1行ずつ表示
今回はSQLの実行結果を全件受けてタプルに格納して、printしています。
1件ずつ受けたい場合は、cusor.fetchone()で受けてください。
これができればあとは投げるSQLをINSERTにしたり、UPDATEにしたり、DELETEに変えればOK.
python + Flask 一番最初に作るやつ hello python! をweb表示
とりあえず、ブラウザで hello python! って表示させるのが一番先なので、これを作ってここからどんどん派生させて、最終的にpython + Flask + MySQLのwebアプリを目指します。
- hello.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>hello python!っていうページ</title> <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}"> </head> <body> <h1>hello, python!</h1> <h2> <ul> <li><a href="./set">view logs</a></li> <li><a href="./view">store logs</a></li> </ul> </h2> <hr> </body> </html>でcssのパスを指定しています。
おなじみbootstrapを使いこなしたいと思ってます。
static DIRの配下にcssを格納し、flaskの url_forを使ってパスを渡しています。
まあ、こうやって書けばパスが渡るんだと思っていれば、OKかと。
やりたいことが実現できる!を最優先なので、細かいことは別の機会に。
- でリンクをきっていますが、これはこの後で実現したい機能用なので、今は無視。
python + flaskでwebページを表示する場合、イメージはこんな感じ。
で、pythonの本体は、こんな感じになります。
- hello.py
from flask import Flask, render_template #app app = Flask(__name__) # 画面関連 ============================================================================== @app.route('/') def render(): return render_template("hello.html") #main==============================================================================- if __name__ == "__main__": app.run(debug=True)
1行目で、Flaskとrender_templateをimportします。
Flaskは必須。
render_templateは、pythoのプログラムとhtmlを紐づけるのに使います。
#app
app = Flask(_name_)は、フレームワークにFlaskを使ってwebサを立てますと宣言なので、定型お約束です。
#画面表示
http://192.168.0.1:5000/〇〇
の/〇〇で呼ばれたリクエストをpythonのプログラムのどこで処理するかを紐づけます。
今回は / でリクエストなので、
@app.route('/')
に紐づきます。
http://192.168.0.1:5000/sampleなら、
@app.route('/sample')に紐づきます。
render_templateは、プログラムからどのhtmlを呼び出してブラウザに返すかを設定します。
ビジネスロジックは、def render() ~ returnの間に書きます。
ここでは、ただhtmlを表示するだけなので、記述なし。
#main
最後にwebサを実行するための記述で、基本こうやって書けば動く!の認識でOK.
社内proxyからpipを通す
会社のPCって、大抵Windowsで当然のことながらインターネットに出るためには社内プロキシを通る必要があります。
pythonだとpipでモジュールを簡単に追加インストールできるけど、そのままだと大抵社内プロキシが通らない。
で試したことは、以下の2つ。
2つやったらpipが通りました。
- 環境変数にプロキシをsetしてあげる。
set HTTP_PROXY= http://アカウント:パスワード@192.168.0.1:8080 set HTTPS_PROXY= http://アカウント:パスワード@192.168.0.1:8080
- pipのオプションで社内プロキシを指定してあげる。
pip install requests --proxy=http://アカウント:パスワード@192.168.0.1:8080
ちょっとめんどくさいけど、しょうがないですね。