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

pythonプログラムのデーモン化で詰まったところメモ

More than 1 year has passed since last update.

はじめに

pythonで常駐系プログラムを書いたのはいいのですが,
現状だと異常終了したらそのままなので,勝手に再起動するようにしたいなぁ,と.

ということで,pythonプログラムをUNIX系システム上でデーモン化してみることにしました.

作り方は先駆者様がいらっしゃるので省略することにして,詰まったところをメモしていきます.

<11/28追記>
改行コードについて書き忘れていたので追記しました.

システムにPythonが複数入ってる

TensorFlowをビルドするときに複数verが必要だと聞いたのでインストールしていました.
おかげで2.7/3.5/3.6とバージョンが乱立していました.普段使っているのは3.6のはず...

とりあえず,コンソールで普段使っているpythonのバージョンをチェックして,
そこから各種Pythonのパスを直接たたいて,一致するバージョンをチェックします.

$ python3

$ /ABSOLUTEPATH/python3
# 出力が一致したバージョンが当たり
# これ echo $PATHでいいような気がする

あとは絶対パスでSheBangをプログラムの頭に書いてあげます.

main.py
#!/ABSOLUTEPATH/python3

import hoge
import huga

...

なぜかserviceがプログラムを認識しない

私の場合,「コードをWindows環境で書いて,Unix系環境上で動かそうとしている」ことが問題でした.
改行コードが違うと正しく認識してくれない(らしい)です.

私の場合はvimで開いて

:se ff=unix
:wq

これで正しく読んでくれるようになりました.

なぜか一部モジュールがインポートできない

serviceを動かすと,なぜかImportErrorで止まりました.
試しに対話モードで同じPythonを起動して,同モジュールをimport.
こっちでは成功します.

もしかして,と思って,プログラムにsys.pathを吐かせてみます.

main.py
#!/ABSOLUTEPATH/python3

# sysを先にimportしてから
import sys
print(sys.path)

pipで入れたモジュールのパスだけ通ってない...なんで???

原因がわからなくて歯がゆいですが,強引にパスを通して解決.

main.py
#!/ABSOLUTEPATH/python3

import sys
sys.path.append("/pipmodulepath/")
#試しに吐かせてみる
print(sys.path)

これで,一応問題は解決したのですが...

別のモジュールがエラーを吐く

今度はTensorFlowがエラーを吐きました.

どうやら,「ビルドしたTensorFlowとは別のTensorFlowが動いている」らしいです.

sys.pathは要素番号の若いほうが優先して読まれるらしいので,

先ほどのpipモジュールが入っているパスの優先順位を上げてあげます.

main.py
#!/ABSOLUTEPATH/python3

import sys
# 要素番号0はプログラムが入っているディレクトリです
# 1番にpipで入れたモジュールのパスを割り込ませる
sys.path.insert(1, "/pipmodulepath/")

import hoge
import huga

...

これでやっと正常に動きました.
プロセスキルしても数秒後に別のPIDでプログラムを動かし始めます.

おわりに

具体的なプログラムが欠けていて読みにくかったとは思いますが,
かなり急ぎ足で書いたものなのでご容赦を...

余裕ができて気が向いたら,
サンプルコードで同じことをして記事を更新しようと思います.

Why do not you register as a user and use Qiita more conveniently?
  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
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