それっぽい技術メモ

UNIXからpythonまで、技術系メモ。知識は人類の共有財産です。

Linux でよく使うコマンド nohup

TeraTermSRVにつないでバッチ実行とかしてる時、気付くと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側はこんな感じで初期設定している前提で。

テーブル構成とデータ

f:id:kopumin:20200606103927p:plain
基本テーブル1

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アプリを目指します。

  1. 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ページを表示する場合、イメージはこんな感じ。
    f:id:kopumin:20200604174823p:plain
    python + Flask概要
    で、pythonの本体は、こんな感じになります。

    1. 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.



Flask用にDIRをきる

python + Flaskで開発を進めるために、とりあえずディレクトリをきっていきます。

作りながら勉強していくので、とりあえず最低限。

python_code   :pythonのコード類諸々書いてくルート
└ web      :flaskのルート
 ├ static      :画像とか静的ファイルをおくところ
 ├ template   :htmlを置いておくところ
 └ hello.py    : pythonの本体。 必要に応じてclass分割していきたい。

厳密にいうといろいろDIRが足りないけど、最低限これだけあれば行けるはず。



社内proxyからpipを通す

会社のPCって、大抵Windowsで当然のことながらインターネットに出るためには社内プロキシを通る必要があります。
pythonだとpipでモジュールを簡単に追加インストールできるけど、そのままだと大抵社内プロキシが通らない。

で試したことは、以下の2つ。
2つやったらpipが通りました。

  1. 環境変数にプロキシをsetしてあげる。
set HTTP_PROXY= http://アカウント:パスワード@192.168.0.1:8080
set HTTPS_PROXY= http://アカウント:パスワード@192.168.0.1:8080
  1. pipのオプションで社内プロキシを指定してあげる。
pip install requests --proxy=http://アカウント:パスワード@192.168.0.1:8080

ちょっとめんどくさいけど、しょうがないですね。