質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5231閲覧

起動時に.serviceで起動するpythonプログラムのエラーログや原因を取得したい

morutemu

総合スコア45

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/05/09 05:41

基本情報:
OS:raspbeian
プログラム:python

内容:
pythonプログラムを起動時に起動させたいのですが、どうやらうまく動作せず、尚且つ、.serviceによる起動だとバックグラウンドでターミナルが起動し実行されているようなので、どのようにエラーが出ているのかわからず困っております。
実は以前に同じ質問をしたのですが、エラーログの取得をして、どういったエラーが出ているのか確認してみてはどうですか?と、回答があったのですが、実際どのようにエラーを取得したらよいか分からず困っております。

https://teratail.com/questions/124911

ちなみにプログラムはダブルクリックで起動させると動いていますが、自動起動はしません。
ただし、pythonファイルのファイル名と場所はそのままに、中のプログラムを消して、別のプログラムを入れたところ自動起動するみたいでした。

ファイル場所:
pythonファイル場所:/opt/GarbageDayReminder/GarbageDayReminder.py
.serviceファイル場所:/etc/systemd/system/GarbageDayReminder.service

動作:
シンボリックを作成済み:sudo systemctl enable GarbageDayReminder.service

pythonプログラム:

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4# +++ モジュール +++ 5from threading import Thread 6import RPi.GPIO as GPIO 7import datetime 8import schedule 9import pandas 10import time 11import csv 12import os 13 14# +++ 変数 +++ 15# リマインド時間 16spc_time = "7:20" 17 18# 確認時間 19start_time = "00:00:00" 20end_time = "08:30:00" 21 22# +++ クラス +++ 23class GarbageDayReminder(object): 24 # イニシャライズ 25 def __init__(self): 26 pass 27 28 # 日付処理 29 def date(self): 30 # 変数 31 FormatDay = "%Y/%m/%d " 32 FormatTime = "%H:%M:%S" 33 34 # 今日の日時を取得 35 now = datetime.datetime.now() 36 37 # 明日の日時を取得 38 tmr = now + datetime.timedelta(days=1) 39 40 # 1990-01-01対策の現在日付を追加 41 date = now.strftime(FormatDay) 42 43 # 今日、明日を振り分ける時間を作成 44 start = datetime.datetime.strptime(date + start_time, FormatDay + FormatTime) 45 end = datetime.datetime.strptime(date + end_time, FormatDay + FormatTime) 46 47 # 今日、明日日付取得の分岐 48 if start <= now <= end: 49 # 今日日付の取得 50 today = "{}/{}/{}".format(now.year, now.month, now.day) 51 return today ,"today" 52 else: 53 # 明日の日付を取得 54 tommorow = "{}/{}/{}".format(tmr.year, tmr.month, tmr.day) 55 return tommorow ,"tommorow" 56 57 # csv処理 58 def csv(self,date): 59 # データが格納されている作業ディレクトリまでパス指定 60 os.chdir("/opt/GarbageDayReminder") 61 62 # csvファイルを読み込む 63 df = pandas.read_csv("garbage_day.csv") 64 65 # 何のゴミの日か取得 66 garbage = df[df["日付"] == date]["ゴミ"].values[0] 67 68 return garbage 69 70 # リマインダー処理 71 def reminder(self, now, garbage): 72 # 辞書 73 gb_dict = {"燃":"燃やすごみ",\ 74 "不":"燃やさないごみ",\ 75 "缶":"空き缶、スプレー缶、空きびん、廃蛍光管",\ 76 "資":"プラスチック製容器梱包、ペットボトル",\ 77 "紙":"紙類ごみ",\ 78 "草":"せんてい枝、庭の草", \ 79 "粗":"粗大ごみ"} 80 81 # 今日、明日の切替 82 if now == "today": 83 now = "今日" 84 elif now == "tommorow": 85 now = "明日" 86 else: 87 return 88 89 # リマインド 90 if garbage in gb_dict: 91 msg = "/opt/jtalk/jtalk.sh " + "ぽーーん!" + now + "は" + gb_dict[garbage] + "の日です" 92 os.system(msg) 93 else: 94 msg = "/opt/jtalk/jtalk.sh " + "ぽーーん!" + now + "のごみの日はありません" 95 os.system(msg) 96 97 # 中間処理 98 def intermediate(self): 99 # 日付処理 100 date, now = gdr.date() 101 102 # csv処理 103 garbage = gdr.csv(date) 104 105 # リマインダー処理 106 gdr.reminder(now, garbage) 107 108 # 指定時間処理 109 def specified_time(self): 110 # 指定時間に中間処理を実行 111 schedule.every().day.at(spc_time).do(gdr.intermediate) 112 while True: 113 schedule.run_pending() 114 time.sleep(1) 115 116 # チェック処理 117 def button(self): 118 GPIO.setmode(GPIO.BCM) 119 120 #GPIO12pinを入力モードとし、pull up設定とします 121 GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP) 122 123 while True: 124 GPIO.wait_for_edge(12, GPIO.FALLING) 125 sw_counter = 0 126 127 while True: 128 sw_status = GPIO.input(12) 129 if sw_status == 0: 130 sw_counter = sw_counter + 1 131 if sw_counter >= 30: 132 print("長押し") 133 gdr.intermediate() 134 break 135 else: 136 print("短押し") 137 break 138 139 time.sleep(0.01) 140 141 print(sw_counter) 142 143 # メイン処理 144 def main(self): 145 # 指定時間処理(マルチスレッド) 146 t = Thread(target=gdr.specified_time) 147 t.start() 148 149 # デバッグ用 150 #gdr.intermediate() 151 152 # ボタン処理 153 gdr.button() 154 155# +++ 初期動作 +++ 156if __name__ == "__main__": 157 # GarbageDayReminderクラスをインスタンス化して実行 158 gdr = GarbageDayReminder() 159 gdr.main()

.serviceファイル

service

1[Unit] 2Description = GarbageDayReminder 3 4[Service] 5ExecStart = /usr/bin/python /opt/GarbageDayReminder/GarbageDayReminder.py 6Restart = always 7Type = simple 8 9[Install] 10WantedBy = multi-user.target

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

とりあえずこうしてみましょうか。

python

1import traceback 2 3if __name__ == "__main__": 4 try: 5 # GarbageDayReminderクラスをインスタンス化して実行 6 gdr = GarbageDayReminder() 7 gdr.main() 8 except: 9 with open("見やすくて権限の問題のないファイルを適当に指定してください", "w") as f: 10 traceback.print_exc(file=f)

if __name__ == "__main__":以下までは無事到達していて、例外で落ちていることが前提です。

投稿2018/05/09 07:15

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/05/09 11:21

どうやら、そこにたどり着けていないようですね。 起動時にファイルと開くような動作はしませんでした。
morutemu

2018/05/09 11:24

if __name__ == "__main__": try: # GarbageDayReminderクラスをインスタンス化して実行 gdr = GarbageDayReminder() gdr.main() except: with open("/home/pi/a.txt", "w") as f: traceback.print_exc(file=f) このように入れてみました。
morutemu

2018/05/10 23:26 編集

yahoo知恵袋より、聞いた所 /var/log/syslog にてエラーログが見れるということで、確認したところ scheduleのimportエラーでした。 一応、pip install scheduleではインストールしてあるので、ローカルには落ちていますが、起動時に起動させようとすると起動しないようです。もし何かわかれば教えて下さい
hayataka2049

2018/05/10 23:31

今気づいたけど、なんでシェバンは/usr/bin/env pythonで.serviceは/usr/bin/pythonになってるんですか?
morutemu

2018/05/11 01:04

どちらも /usr/bin/env python に統一した方が良いですか?
hayataka2049

2018/05/11 01:34

とりあえず試してみるのは一つの手ですね。 アタリだったら嬉しいですが、ダメなら両方の実行方法でsys.versionやsys.pathを吐いてみて、どんな違いがあるか観察してみましょうか。自動実行の方は(落ちる前に)ファイル先頭でimport sysして、ファイル出力でもするか、syslogに吐いても良いでしょう(できるらしいので) https://docs.python.jp/3/library/syslog.html
morutemu

2018/05/11 03:19

了解です。 仕事終わったら試して見ます!
morutemu

2018/05/11 11:15

残念ながら…でした。 ExecStart = /usr/bin/env python /opt/GarbageDayReminder/GarbageDayReminder.py と、入れましたが、 同じようにimport scheduleのエラーでした。。 無念。
guest

0

自己解決

sudo pip install schedule

↑が解決方法でした。

私が解決したわけでないですが以下が解決方法でした。
私の質問に付き合っていただけた方ありがとうございました!

https://teratail.com/questions/125792

投稿2018/05/12 03:23

morutemu

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしかして、実行するpythonはpyenvなどを使って構築されてますか?

投稿2018/05/11 03:06

naoki

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/05/11 11:39

いや、使ってないと思います。 たぶん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問