Help us understand the problem. What is going on with this article?

毎朝決まった時間にPC起動させpythonプログラムを実行する方法

More than 3 years have passed since last update.

毎朝前日の株価値動きを分析し、結果を自動でメールで送るプログラムを動かすため環境を整えてみました。
そのうちプログラムの自動起動ができるようになるまで、やったことをまとめます。

手順

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によってやり方も変わり、自動起動できないものもありますが、私の環境では以下のような感じでした。
IMG.jpg

曜日が指定できなかったので時間のみ指定しました。
土日には特ににやる処理がないのですがpythonプログラムの中で曜日を判定し、土日ならシャットダウンするようにすることで妥協しました・・・

pythonを起動するシェルスクリプトを /etc/profile.d/ に作成

Linuxの場合、OSが立ち上がった時に最初に実行して欲しいファイルは /etc/profile.d/ に入れておくといいようです。
Windowsでいうスタートアップのフォルダでしょうか。

まずファイルを作るのに権限がいるので以下のように

$ cd /etc/profile.d/
$ sudo gedit auto_start.sh

シェルスプリクトは以下の通り

auto_start.sh
#!/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py

ここでcdで移動せず直接絶対パスを指定してpythonを実行してもよいのですが、そうするとpythonのプログラム内でのcsvの保存先や複数ファイルをインポートするときに扱う相対パスが /etc/profile.d/ を基準として扱われてしまいます。
そこでカレントディレクトリを目的ファイルのフォルダに移動してから実行するとそういった問題を回避できました。

ただしこうしてしまうと端末を立ち上げたときのカレントディレクトリがpythonファイルのフォルダになってしまうので最後にきちんと戻しておく必要があります。

auto_start.sh
#!/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py
cd

実行後シャットダウンさせるシェルスクリプトをつくる

以下のシェルスプリクトを実行するとシャットダウンされます。

shutdown.sh
#!/bin/sh
sudo shutdown -h now

ただしこれだけではうまくいきません。
sudoコマンドを普通に使うとユーザーが手でパスワードを入力しなくてはいけません。
これでは自動化している意味がないのでshutdownコマンドをパスワード入力の必要がないようにしてしまいます。

そこでsudoの設定ファイルを編集します。
(※もちろんきわどい行為なので自己責任で)

$ sudo gedit /etc/sudoers

そしてファイルの末尾に以下の内容を追記します。

/etc/sudoers
"ユーザー名" ALL=(ALL) NOPASSWD:/sbin/shutdown -h now

あとはpython側で目的の処理が終わった後にこのシェルスプリクトを呼び出せばいいので

analysis.py
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までには処理が終わるのでこの時間内であったときのみ処理を実行するようにしています。

analysis.py
import datetime
d = datetime.datetime.today()

if (d.hour == 8) and (0 <= d.minute <= 30):
    #やりたいこと
    #シャットダウン処理

シャットダウンのみ回避したいとき

$ sudo shutdown -c

最後に

個人的な利用なので知識不足を強引さで補っているところが多々あります。
よりよい方法をご存知の方いらっしゃいましたらご教授いただければ幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした