やりたいこと
OSを起動したときにPythonプログラムを起動するものを作っているのですが中々うまく行きません。
Pythonプログラムはmariadbから値を参照し、その中と同じ値を入力すれば解錠されるというものです
Pythonプログラムはmariadbと紐づけをしたプログラムなのでrc.localなどではできないためsystemdを用いて行っています。
systemdはtest.serviceという名前にしています。Pythonはtest.pyという名前です。
発生している問題・エラーメッセージ
test.service - test
Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2021-12-10 14:09:35 JST; 54s ago
Main PID: 388 (code=exited, status=1/FAILURE)
12月 10 14:09:35 raspberrypi python3[388]: self.connect(**kwargs)
12月 10 14:09:35 raspberrypi python3[388]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/abstracts.py", line 1014, in conn
12月 10 14:09:35 raspberrypi python3[388]: self._open_connection()
12月 10 14:09:35 raspberrypi python3[388]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/connection.py", line 426, in _ope
12月 10 14:09:35 raspberrypi python3[388]: self._socket.open_connection()
12月 10 14:09:35 raspberrypi python3[388]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/network.py", line 580, in open_co
12月 10 14:09:35 raspberrypi python3[388]: _strioerror(err),
12月 10 14:09:35 raspberrypi python3[388]: mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '10.22.94.152:3306
12月 10 14:09:35 raspberrypi systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
12月 10 14:09:35 raspberrypi systemd[1]: test.service: Failed with result 'exit-code'.
ちなみにエラー部分は再起動したときのもので、起動したあとにsystemctl start test.serviceをしてstatusをすると
● test.service - test
Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-12-10 15:00:15 JST; 995ms ago
Main PID: 2428 (python3)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/test.service
└─2428 /usr/bin/python3 /home/pi/Python/test.py
12月 10 15:00:15 raspberrypi systemd[1]: Started test.
エラーはでてないので、再起動したときmariadbサーバより先に立ち上がっているからだめなんだろうなと思っています。
該当のソースコード
#Python test.py
import mysql.connector
import RPi.GPIO as GPIO
import time
#GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
#データベース接続
db = mysql.connector.connect(
host='10.22.94.152',
port='3306',
user='root',
password='password',
database='testdb',
charset ='utf8',
)
#接続できているか確認
print(db.is_connected())
#カーソル・参照する場所
cur = db.cursor()
cur.execute("select * from test")
rows = cur.fetchall()
gen = (row[1] for row in rows)
at = list(gen)
print(at)
while(1):
#入力関数
#val = input('>>入力待ち:')
af = int(22495) #データベース内の値をいれています、これをいれないとinput部分で.serviceにエラーが出るのでinputはコメント文にしています。
#読み込み時の判定
if af in at :
GPIO.output(25, GPIO.HIGH)
time.sleep(3)
print("解錠")
print ("----------")
GPIO.cleanup()
break
else:
GPIO.output(25, GPIO.LOW)
time.sleep(0.2)
print ("読み込んだ値が違います") print ("----------")
#test.service
[Unit]
Description = test
After = mariadb.service
[Service]
User = root
ExecStart = /usr/bin/python3 /home/pi/Python/test.py
Type = simple
[Install]
WantedBy = multi-user.target
試したこと
AfterをBeforeにしてみたり。
targetをnetwork.targetやmysql.targetに変えたりしました。
補足情報
Raspbian GNU/Linux 10 (buster)
Python3.7.3
初めて質問するので至らなぬ点があるかもしれませんがご了承ください
回答2件
あなたの回答
tips
プレビュー