毎朝前日の株価値動きを分析し、結果を自動でメールで送るプログラムを動かすため環境を整えてみました。
そのうちプログラムの自動起動ができるようになるまで、やったことをまとめます。
手順
1.パーティション分けてUbuntuをインストール
2.ブートローダーでデフォルトの起動OSをUbuntuに
3.BIOSで毎朝指定時間に起動するよう設定
4.pythonを起動するシェルスプリクトを /etc/profile.d/ に作成
5.実行後シャットダウンさせるシェルスクリプトをつくる
6.ファイルに実行権限を与える
7.通常起動のための設定
実際の流れ
パーティション分けてUbuntuをインストール
安定して動作させるために普段利用しているOSとわけています。
Gpartedをつかってデータ保存用に使っていた2TBのハードディスクから200GBほどUbuntuインストールように分けました。
(※既にデータのは入っているHDDのパーティション分割はデータ破損の危険があるので要注意です)
Ubuntu https://www.ubuntulinux.jp/download
Gparted http://www.gigafree.net/system/drive/gparted.html
インストール手順等は省略
ブートローダーでデフォルトの起動OSをUbuntuに
Ubuntuを入れるとGRUBというブートローダーも一緒に導入してくれるので、GRUBの設定を変えてデフォルトの起動OSをUbuntuにします。
とはいっても基本、UbuntuがデフォルトになっているはずなのでOSを3つ以上入れたり他のブートローダーを使ったりしなければそのままです。
BIOSで毎朝指定時間に起動するよう設定
BIOSによってやり方も変わり、自動起動できないものもありますが、私の環境では以下のような感じでした。
曜日が指定できなかったので時間のみ指定しました。
土日には特ににやる処理がないのですがpythonプログラムの中で曜日を判定し、土日ならシャットダウンするようにすることで妥協しました・・・
pythonを起動するシェルスクリプトを /etc/profile.d/ に作成
Linuxの場合、OSが立ち上がった時に最初に実行して欲しいファイルは /etc/profile.d/ に入れておくといいようです。
Windowsでいうスタートアップのフォルダでしょうか。
まずファイルを作るのに権限がいるので以下のように
$ cd /etc/profile.d/
$ sudo gedit auto_start.sh
シェルスプリクトは以下の通り
# !/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py
ここでcdで移動せず直接絶対パスを指定してpythonを実行してもよいのですが、そうするとpythonのプログラム内でのcsvの保存先や複数ファイルをインポートするときに扱う相対パスが /etc/profile.d/ を基準として扱われてしまいます。
そこでカレントディレクトリを目的ファイルのフォルダに移動してから実行するとそういった問題を回避できました。
ただしこうしてしまうと端末を立ち上げたときのカレントディレクトリがpythonファイルのフォルダになってしまうので最後にきちんと戻しておく必要があります。
# !/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py
cd
実行後シャットダウンさせるシェルスクリプトをつくる
以下のシェルスプリクトを実行するとシャットダウンされます。
# !/bin/sh
sudo shutdown -h now
ただしこれだけではうまくいきません。
sudoコマンドを普通に使うとユーザーが手でパスワードを入力しなくてはいけません。
これでは自動化している意味がないのでshutdownコマンドをパスワード入力の必要がないようにしてしまいます。
そこでsudoの設定ファイルを編集します。
(※もちろんきわどい行為なので自己責任で)
$ sudo gedit /etc/sudoers
そしてファイルの末尾に以下の内容を追記します。
"ユーザー名" ALL=(ALL) NOPASSWD:/sbin/shutdown -h now
あとはpython側で目的の処理が終わった後にこのシェルスプリクトを呼び出せばいいので
import subprocess
# やりたいこと
subprocess.call("./shutdown.sh")
ファイルに実行権限を与える
一通りファイルを作ったので、シェルスクリプトのファイルとpythonのファイルに対して実行権限を与えます。
そうしないと自動で実行するとき権限ありませんよとエラーが出てしまいます。
$ cd /etc/profile.d/
$ sudo chmod a+x auto_start.sh
$ cd "pythonファイルまでのパス"
$ sudo chmod a+x analysis.py
$ sudo chmod a+x shutdown.sh
通常起動のための設定
メンテナンス用にログインする際も処理が実行されシャットダウンまでされると困るのでそれを回避します。
pythonで時間指定
私のプログラムの場合は毎朝8:00に起動し8:30までには処理が終わるのでこの時間内であったときのみ処理を実行するようにしています。
import datetime
d = datetime.datetime.today()
if (d.hour == 8) and (0 <= d.minute <= 30):
#やりたいこと
#シャットダウン処理
シャットダウンのみ回避したいとき
$ sudo shutdown -c
最後に
個人的な利用なので知識不足を強引さで補っているところが多々あります。
よりよい方法をご存知の方いらっしゃいましたらご教授いただければ幸いです。