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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Raspberry Pi

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

Q&A

解決済

2回答

2279閲覧

Pythonを自動起動したい

karashiE

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Raspberry Pi

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

0グッド

0クリップ

投稿2021/12/10 06:08

編集2021/12/13 01:30

やりたいこと

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

初めて質問するので至らなぬ点があるかもしれませんがご了承ください

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

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

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

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

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

TaichiYanagiya

2021/12/11 15:08

mariadb は python プログラムと同じサーバーで稼働するのですか?
karashiE

2021/12/13 00:15

質問ありがとうございます。 はい、同じサーバーに稼働しています。
guest

回答2

0

ベストアンサー

After (Wants + After) で指定した mariadb.service が先に起動するけれど、3306 番ポートが LISTEN になるまでに時間がかかっているのだと思います。

ppaul さんの回答のとおり、test.py 側でリトライするか、ExecStartPre で 3306 番ポートに接続できることを確認してから test.py を起動するといいと思います。

[Unit] Description=test After=mariadb.service Wants=mariadb.service [Service] User=root ExecStartPre=/bin/bash -c "until nc -z 10.22.94.152 3306 ; do sleep 1 ; done" ExecStart= /usr/bin/python3 /home/pi/Python/test.py Type=simple [Install] WantedBy=multi-user.target

投稿2021/12/13 06:54

TaichiYanagiya

総合スコア12173

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

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

karashiE

2021/12/13 07:16

そのように打ち直した所エラーが出ずに動作しました。 ありがとうございました!
guest

0

python

1print(db.is_connected())

python

1from time import sleep 2while not db.is_connected(): 3 sleep(5)

に変更すれば良いのではないでしょうか。

投稿2021/12/10 06:46

ppaul

総合スコア24670

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

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

karashiE

2021/12/10 07:02

解答ありがとうございます。変えてみましたが変わりませんでした... エラーをのせておきます。 ● test.service - test Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Fri 2021-12-10 15:55:05 JST; 2min 37s ago Main PID: 420 (code=exited, status=1/FAILURE) 12月 10 15:55:05 raspberrypi python3[420]: self.connect(**kwargs) 12月 10 15:55:05 raspberrypi python3[420]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/abstracts.py", line 1014, in connect 12月 10 15:55:05 raspberrypi python3[420]: self._open_connection() 12月 10 15:55:05 raspberrypi python3[420]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/connection.py", line 426, in _open_connection 12月 10 15:55:05 raspberrypi python3[420]: self._socket.open_connection() 12月 10 15:55:05 raspberrypi python3[420]: File "/usr/local/lib/python3.7/dist-packages/mysql/connector/network.py", line 580, in open_connection 12月 10 15:55:05 raspberrypi python3[420]: _strioerror(err), 12月 10 15:55:05 raspberrypi python3[420]: mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '10.22.94.152:3306' (101 Network is unreachable) 12月 10 15:55:05 raspberrypi systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE 12月 10 15:55:05 raspberrypi systemd[1]: test.service: Failed with result 'exit-code'.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問