Pythonファイルをデーモン化してみる
Pythonファイルはコマンドで実行するには、毎回python ファイル名.py と打たなければいけません。これをデーモン化してみたいと思います。
デーモン化って何?
平たく言うと、自動起動したりCentOSコマンドでいうsystemctlコマンドで起動したりすることになります。
デーモン化はなぜ?
デーモン化する必要がそもそもあるの?と思われる方もいるかもしれません。例えば「ブラウザと連携(mod_wsgi)とか使えば良いんじゃないのか?」という意見もでると思います
デーモン化する理由
WEBサービスのようにブラウザで見せるのではなく、例えばslackbotのようにアプリと連携をする場合は、デーモン化すれば自動で実行されるので楽です。止めるときもsystemctlコマンドでできるので楽かなと思います。
簡単にできるの?
ini.dだとちょっと難しいらしいですが、systemctlならinit.dと比べると楽なのでやっていきます。簡単かどうかは・・・わからないです
デーモン化実行
CentOS7にApache or nginx + hhvmでWordPressを動かしてみるでも少し書いていますが、**/etc/systemd/system/**配下にファイルを作って置きます。
環境
今回の環境は以下のようになります
- 実行ファイル:/home/macan/slackbot/run.py
- 実行ユーザー:macan
- パーミッション:755
となります。
run.pyの中身
Pythonファイルのソースコードはこんな感じです [python] #!/usr/local/pyenv/shims/python #coding: utf-8 from slackbot.bot import Bot def main(): bot = Bot() bot.run() if __name__ == "__main__": print ('slackbot開始') main() [/python]
rund.serviceファイルの作成
デーモンファイルは.serviceというファイル名なのでそれで作成します。ファイル名は任意です [text] [root@localhost ~]# vi /etc/systemd/system/rund.service [Unit] Description=Python Slack Bot [Service] ExecStart=/home/macan/slackbot/run.py Restart=on-failure Type=simple user=macan group=macan [Install] WantedBy=multi-user.target [/text] このようにします。Type=simpleにすることで自動的にPIDが作成されます。ExecStartがファイルのパスをさしてます。
リロード
デーモンをリロードします [text] [root@localhost ~]# systemctl daemon-reload [/text]
起動・確認
[text] [root@localhost ~]# systemctl start rund [root@localhost ~]# systemctl status rund ● rund.service - Python Slack Bot Loaded: loaded (/etc/systemd/system/rund.service; disabled; vendor preset: disabled) Active: active (running) since 木 2018-11-15 20:57:16 JST; 1s ago Main PID: 2026 (python) CGroup: /system.slice/rund.service └─2026 python /home/macan/slackbot/run.py [/text] となっていれば起動成功です
起動エラー
[text] [root@localhost ~]# systemctl status rund ● rund.service - Python Slack Bot Loaded: loaded (/etc/systemd/system/rund.service; disabled; vendor preset: disabled) Active: failed (Result: start-limit) since 木 2018-11-15 20:56:53 JST; 6s ago Process: 2017 ExecStart=/home/macan/slackbot/run.py (code=exited, status=203/EXEC) Main PID: 2017 (code=exited, status=203/EXEC) [/text] のように、code=exited, status=203/EXECが出たときはログをみます
ログの確認
[text]
[root@localhost ~]# cat /var/log/messages
Nov 15 18:28:58 localhost systemd: Unit rund.service entered failed state.
Nov 15 18:28:58 localhost systemd: rund.service failed.
Nov 15 18:28:58 localhost systemd: rund.service holdoff time over, scheduling restart.
Nov 15 18:28:58 localhost systemd: Started Python Slack Bot.
Nov 15 18:28:58 localhost systemd: Starting Python Slack Bot...
Nov 15 18:28:58 localhost systemd: Failed at step EXEC spawning /home/macan/slackbot/run.py: Exec format error
Nov 15 18:28:58 localhost systemd: rund.service: main process exited, code=exited, status=203/EXEC
[/text]
Failed at step EXEC spawning /home/macan/slackbot/run.py: Exec format errorとでてました。ものこれがでたかたは1行目にPythonの宣言コードがあるか確認してください
[python]
#!/usr/local/pyenv/shims/python
[/python]
がないと駄目です。Pythonのリンクの確認は
[python]
[macan@localhost ~]$ which python
/usr/local/pyenv/shims/python
[/python]
ででます。
[text]
Jun 26 23:26:13 v157-7-52-193 systemd: Failed at step EXEC spawning /home/centos/slackbot/run.py: Permission denied
Jun 26 23:26:13 v157-7-52-193 systemd: rund.service: main process exited, code=exited, status=203/EXEC
Jun 26 23:26:13 v157-7-52-193 systemd: Unit rund.service entered failed state.
Jun 26 23:26:13 v157-7-52-193 systemd: rund.service failed.
[/text]
が出た場合はパーミッションエラーの可能性が高いです。755か確認しましょう
[text]
Jun 26 23:31:55 v157-7-52-193 systemd: Failed at step EXEC spawning /home/centos/slackbot/run.py: No such file or directory
Jun 26 23:31:55 v157-7-52-193 systemd: rund.service: main process exited, code=exited, status=203/EXEC
Jun 26 23:31:55 v157-7-52-193 systemd: Unit rund.service entered failed state.
Jun 26 23:31:55 v157-7-52-193 systemd: rund.service failed.
Jun 26 23:31:56 v157-7-52-193 systemd: rund.service holdoff time over, scheduling restart.
Jun 26 23:31:56 v157-7-52-193 systemd: Stopped Python Slack Bot.
Jun 26 23:31:56 v157-7-52-193 systemd: start request repeated too quickly for rund.service
Jun 26 23:31:56 v157-7-52-193 systemd: Failed to start Python Slack Bot.
Jun 26 23:31:56 v157-7-52-193 systemd: Unit rund.service entered failed state.
Jun 26 23:31:56 v157-7-52-193 systemd: rund.service failed.
[/text]
のエラーが出た場合は、改行コードが
で保存されてしまったため、Linuxの
に直す必要がある。かもしれません
訂正コマンドは以下になります
[text]
sed -i 's/
//' <対象のファイル>
[/text]
参考サイト:http://totech.hateblo.jp/entry/2014/03/19/174129
