VPSでpythonのscheduleモジュールをバックグラウンドで実行する方法

以下の記事でpythonのscheduleモジュールの説明をしたので、実際にVPS上で実行する方法を備忘録として残しておきます。

pythonのScheduleモジュールで株価を自動スクレイピング する方法
今回は、pythonのScheduleモジュールを使ったら、スクレイイングが自動化できたよっていう話です。 Scheduleモジュールはスクレイピング のみならず、いろんな用途で使えるとても汎用性の高いモジュールです。ここで、私の使っている方法を備忘録として記録しておきます。 Scheduleモジュールを使ったサンプルコード ...

 

スポンサーリンク
スポンサーリンク

cronを使わずscheduleモジュールを使う理由

VPSでサーバを借りると、ほぼ確実にLinux系のOSを使うことになります。ubuntuとかCentOSとか。そして、LInux系のOSにはcronと言う、ファイル実行のスケジューリング機能が初期から備わっています。

 

 

「わざわざpythonのscheduleモジュール使わないで最初からcron使えば早くね?」

 

 

と思ったのですが、素人にはハードルが高く断念しました。特に詰んだのは、自作したモジュールが読み込めないこと。cronでファイルを実行すると、PATHの設定が変わるらしくどうもうまくいかない。

 

pythonを使っている方でcronで詰んでいる方はぜひscheduleモジュールの利用を検討してみましょう。

VPS上でsheduleモジュールを動かす際の注意点

scheduleモジュールを普通に動かすと、そのプログラムは永続的に実行され続けることになります。詳細は以下の記事。

pythonのScheduleモジュールで株価を自動スクレイピング する方法

 

処理が終わらないので、プログラムを一度動かすとコマンドラインがその処理で占領され、VPS上で他の処理ができなくなってしまうという致命的なデメリットがあります。

 

 

これだけじゃありません。VPS上でファイルを実行すると、通常サーバへの接続を終了するとファイルの実行も中断されてしまいます。

 

 

scheduleモジュールの良さは、PCを放置してても定刻通りに指定した処理を実行してくれるところにあります。それが「サーバに接続していないとファイルが実行されない」なんて話になると、全く使えません(汗。

 

 

これなら、なおさらcronの方がいいんじゃないか・・・と思いますが、このデメリットを全て解決する方法があるんです。

VPS上でファイルをバックグランドで実行する

通常、VPS上でファイルを実行すると、処理が終わるまでコマンドラインが占領されてしまいますが、これを防ぐ方法があります。それがバックグラウンド処理というやつ。コマンドラインに表示しないで裏側でファイルを動かす方法です。

 

 

これを使えば、コマンドラインを占領せずにファイルを実行することが可能になります。おまけにサーバとの接続を解除しても、24時間いつでもVPS上でファイル実行が可能です。

 

 

通常、コマンドラインでpythonファイルを実行する場合、次のようになります。

python hogehoge.py

 

これをこんな風にすると、処理をバックでしてくれるようになります。

nohup python hogehoge.py &

最初にnohup、最後に&を付けます。これだけです。

 

 

この処理をすると、処理したディレクトリにnohup.outというファイルが自動的に作られます。(lsコマンドで確認してみてください)

 

 

pyファイル上にprintなどによる出力があった場合、全てnohup.outに出力結果が保存されます。いわゆるログファイルですね。

 

 

ログファイルは出力不可にすることもできますが、やり方を忘れました(汗。大量の出力を高頻度で行う場合、ログファイルの容量が膨大となりVPSのストレージを圧迫する可能性があるので、定期的にログファイルは削除しておきましょう。

バックグラウンドの状況を確認する。

バックグラウンド処理をすると、コマンドライン上ではファイルが実行されているかどうか確認することができません。

 

そこで、使うのが「ps」コマンドです。「ps x」と打つと、バックグランドで動いている処理一覧を見ることができます。

hoge@1-1-1-1:~/$ ps x

PID TTY      STAT   TIME COMMAND

10739 ?        S      0:29 python trade.py

25923 pts/0    R+     0:00 ps x

上のがそのサンプル。

 

python trade.pyというのがバックグランドで動かしているファイルです。

 

実行処理を終わらせたい時は、ps xコマンドに表示されるPIDの番号を確認し、「kill 10739」とコマンドを打つと処理が終わります。

 

10739は「python trade.py」処理のPIDなので、このコマンドを打つとこの処理が終了します。

 

まとめると

nohup(実行処理)& でファイルを実行する
nohup.outというログファイルが自動で作成されるので忘れずに
ps xでバックグランドでの実行状況が確認できる
実行を終わらせる時はps xコマンドでPID番号を確認して「kill PID」で終了

 

これで、サーバに接続していなくてもコマンドライン上で別の処理をしていても、動かしたいファイルを実行させ続けることが可能となります。

コメント