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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

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

Python

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

Q&A

解決済

1回答

3460閲覧

ラズパイでsnmptrapを受信し、それを契機に、プログラムを自動実行する方法

dyrobin

総合スコア13

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/05/18 12:08

前提・実現したいこと

ラズパイでのsnmptrapの受信をトリガーに、プログラムを自動実行したいと考えております。
実行したいプログラムは、下記記載のled.pyとなります。
snmptrapを受けると自動でled点滅を行いたいです。

試したこと

https://www.skyarch.net/blog/?p=480
上記サイトを参考に、/etc/snmp/snmptrapd.confに下記を追加記載しましたが、うまくいきません。
「traphandle default /home/pi/dev/led.py」

下記のled.pyで実行するとled点滅ができるため、led.py自体は問題ないと考えております。
【led.py】
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(17, GPIO.OUT)

while True:
try:
GPIO.output(17, 1)
time.sleep(0.5)
GPIO.output(17, 0)
time.sleep(0.5)

except keyboardInterrupt: GPIO.cleanup()

・snmptrapは/var/log/snmptrapd/snmptrapd.logに受信・出力されることを確認済みです。
・raspberry pi 4 3B

質問

上記を実行するために、足りてない部分や誤っている部分をご教示ください。

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

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

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

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

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

TaichiYanagiya

2021/05/18 12:54

syslog (/var/log/messages, /var/log/syslog など) には何かエラーは出ていないでしょうか?
dyrobin

2021/05/18 22:15 編集

/var/log/messagesには起動情報やkernelの履歴等が出力されました。 めぼしいものは出ていないと勝手ながら判断しています。 (その情報も必要であればご教示ください。) /var/log/syslogには以下のようなエラーが出ておりました。 led.pyがimportできてない?文法エラーが出ているように見えます。 May 19 06:50:13 raspberrypi snmptrapd[510]: /home/pi/dev/led.py: 5: /home/pi/dev/led.py: import: not found May 19 06:50:13 raspberrypi snmptrapd[510]: /home/pi/dev/led.py: 7: /home/pi/dev/led.py: Syntax error: word unexpected (expecting ")") 試しに、/home/pi/dev/snmp/led.pyを作成しました。 そして/home/pi/dev/snmpのフォルダには__init__.pyの名前で空フォルダも作成しました。 ⇒/home/pi/dev/snmp/__init__.py そしてsnmp.confも再編集し、再起動した結果、/var/log/syslogには以下のみが出力されるようになりました。解決方法、ご教示頂けないでしょうか。 May 19 07:09:53 raspberrypi snmptrapd[1788]: sh: 1: /home/pi/dev/snmp/led.py: not found
guest

回答1

0

ベストアンサー

led.pyがimportできてない?文法エラーが出ているように見えます。
May 19 06:50:13 raspberrypi snmptrapd[510]: /home/pi/dev/led.py: 5: /home/pi/dev/led.py: import: not found

シェルで実行されているのだと思います。
python で実行されるよう、/home/pi/dev/led.py の先頭行に シバン (/usr/bin/python など) を入れてください。
python 実行ファイルのパスは which python, type python などでわかると思います。
OS によっては python ではなく、python2, python3 かもしれません。

投稿2021/05/18 23:59

TaichiYanagiya

総合スコア12146

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

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

dyrobin

2021/05/19 11:48

下記のようにシバンを入れて実行しましたが、うまくいっておりません。notfounfが表示されます。 snmptrapd.confの一つ上の階層にsnmptrapを配置、その中にled.pyと__init__.pyを配置して実行もしましたが、うまくいきませんでした。 そのほか、解決方法ご教示頂けないでしょうか。 May 19 20:20:45 raspberrypi snmptrapd[2947]: sh: 1: /usr/bin/python3/etc/snmp/led.py: not found May 19 20:22:47 raspberrypi snmptrapd[3006]: sh: 1: /usr/bin/python2/etc/snmp/led.py: not found May 19 20:23:53 raspberrypi snmptrapd[3050]: sh: 1: /usr/bin/python/etc/snmp/led.py: not found May 19 20:35:39 raspberrypi snmptrapd[3284]: sh: 1: /usr/bin/python3/etc/snmp/snmptrap/led.py: not found May 19 20:41:05 raspberrypi snmptrapd[3539]: sh: 1: /usr/bin/python/home/pi/dev/snmptrap/led.py: not found
TaichiYanagiya

2021/05/19 13:13

ごめんなさい。 シバンは「#! /usr/bin/python」など、「#! インタプリタ」形式です。
dyrobin

2021/05/19 22:08 編集

ご回答ありがとうございます。 traphandle default #!/usr/bin/python3/etc/snmp/snmptrap/led.py 上記でnot foundは出なくなりました。 (/usr/bin/python/etc/snmp/snmptrap/led.pyに関するログも出なくなりました) しかし、LEDは点滅しませんでした。 led.pyが思った通りに実行されたのか不明です。 トラップを受信したときには、 /var/log/syslog、/var/log/messagesにはともに下記ログが表示されています。 May 20 06:58:50 raspberrypi root: <UNKNOWN> May 20 06:58:50 raspberrypi root: UDP: [169.254.128.225]:162->[169.254.128.222]:162 May 20 06:58:50 raspberrypi root: DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:16:26.61 May 20 06:58:50 raspberrypi root: SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkDown May 20 06:58:50 raspberrypi root: RFC1213-MIB::ifIndex.7 7 May 20 06:58:50 raspberrypi root: RFC1213-MIB::ifAdminStatus.7 up May 20 06:58:50 raspberrypi root: RFC1213-MIB::ifOperStatus.7 down 何度も申し訳ございませんが、他に見直すべき点など、ご教示頂けませんか。
TaichiYanagiya

2021/05/19 23:53

「シバン」を調べましたか? > traphandle default #!/usr/bin/python3/etc/snmp/snmptrap/led.py このようなことではありません。
dyrobin

2021/05/20 13:15

ご回答ありがとうございます。 「シバン」について調べました。完璧とは言えませんが、理解はできました。 led.pyを下記に書き換えました。 #!/usr/bin/env python import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) GPIO.output(17, GPIO.HIGH) time.sleep(5) GPIO.output(17, GPIO.LOW) GPIO.cleanup() GPIO.setup(17, GPIO.OUT) GPIO.output(17, GPIO.HIGH) time.sleep(5) GPIO.output(17, GPIO.LOW) GPIO.cleanup() /var/log/syslogには下記が出力されました。 May 20 22:06:49 raspberrypi snmptrapd[3954]: /etc/snmp/snmptrap/led.py: 5: /etc/snmp/snmptrap/led.py: import: not found May 20 22:06:49 raspberrypi snmptrapd[3954]: from: can't read /var/mail/time May 20 22:06:49 raspberrypi snmptrapd[3954]: /etc/snmp/snmptrap/led.py: 10: /etc/snmp/snmptrap/led.py: Syntax error: word unexpected (expecting ")") ⇒ /etc/snmp/snmptrap/led.py:5:はimport RPi.GPIOのスクリプトに、 /etc/snmp/snmptrap/led.py:10:はGPIO.setmode(GPIO.BCM)のスクリプトに、 異常があることを示しているようです。 importの方法に誤りがあるのでしょうか。 ・led.pyをpython led.pyで実行した場合と、import ledで実行した場合で結果が異なりました。 ・subprocessというモジュールがあるようですが、今回は必要ないでしょうか。
TaichiYanagiya

2021/05/20 14:13

> /etc/snmp/snmptrap/led.py: 5: /etc/snmp/snmptrap/led.py: import: not found まだ、シェルで実行しようとしているようです。 コマンドラインから「/etc/snmp/snmptrap/led.py」を実行できますか? (「python led.py」ではなく) snmptrapd.conf は「traphandle default /etc/snmp/snmptrap/led.py」になっていますか?
dyrobin

2021/05/21 00:20

ご回答ありがとうございます。 >コマンドラインから「/etc/snmp/snmptrap/led.py」を実行できますか? 上記を実行したところ、下記エラーとなりました。 pi@raspberrypi:~ $ /etc/snmp/snmptrap/led.py /etc/snmp/snmptrap/led.py: 行 5: import: コマンドが見つかりません /etc/snmp/snmptrap/led.py: 行 7: import: コマンドが見つかりません /etc/snmp/snmptrap/led.py: 行 10: 予期しないトークン `GPIO.BCM' 周辺に構文エラーがあります /etc/snmp/snmptrap/led.py: 行 10: `GPIO.setmode(GPIO.BCM)' timeモジュールやRPi.GPIOモジュールがimportできていないと推測しております。 理由・解決方法としては、環境パスが通っているのか確認する、シバンを#!/usr/bin/env python3に変更してみる、https://teratail.com/questions/156032 左記urlに言及されている実行権限を確認する等を考えております。 timeモジュールは標準モジュールであり、最新版が入手できていると認識しています。 RPi.GPIOモジュールは、pipもしくはpip3 installを行い、最新版をインストールできていると考えております。 >snmptrapd.conf は「traphandle default /etc/snmp/snmptrap/led.py」になっていますか? こちらは問題ありませんでした。 その他、解決方法等、ご教示頂けないでしょうか。
TaichiYanagiya

2021/05/21 04:26

「#!」が認識されず、「#」のみのコメントアウトとみなされているようです。 再度、「#!」を確認ください。 全角になっていないか、"head -1 /etc/snmp/snmptrap/led.py | od -c" でコントロールコードなどが入っていないか、確認ください。
dyrobin

2021/05/21 11:34

ご回答ありがとうございます。 「#!」確認しましたが、全角ではありませんでした。 スクリプト中も色文字で、#!/usr/bin/pythonが表示されます。 head -1 /etc/snmp/snmptrap/led.py | od -c 上記を実行すると下記が出力されました。 0000000 \n 0000001 これが何を意味するのか全く意味がわかりません。。。 コントロールコードを調べてもよくわかりません。 どうしたらよいでしょうか。
dyrobin

2021/05/21 12:36 編集

無事、解決できました。 原因は、led.pyの1行目にシバンを書いていなかったことです。 2行目にシバンを書いていたので、うまくimportができなかったようです。 snmptrap受信後、ledが自動で点灯するようになりました。 これまで何度も回答をして下さり、本当にありがとうございます。 またよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問