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

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

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

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

Python

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

Q&A

解決済

2回答

15495閲覧

RaspberryPiで動かすPythonプログラムを強制終了した場合

IzuShin

総合スコア68

Raspberry Pi

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

Python

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

0グッド

2クリップ

投稿2017/06/09 03:58

RaspberryPiで人感センサーで動きをとって、写真を映すアプリをPythonで書いて動かしています。

while Trueでずっと監視させているのですが、コントロールZで強制終了させた場合に、GPIOが解放されずに動きっぱなしに
なってしまいます。
コントロールZで強制終了させた場合にもGPIO.cleanup()を通るようにしたいのですが、どうすればよろしいでしょうか?

Python

1while True: 2 if ( GPIO.input(SENSOR_PIN) == GPIO.HIGH ) and (st + INTAVAL < time.time() ): 3 st = time.time() 4 filename = time.strftime( "%Y%m%d%H%M%S" ) + ".jpg" 5 save_file = SAVEDIR + filename 6 cam.capture( save_file ) 7 8 time.sleep( SLEEPTIME ) 9 10GPIO.cleanup()

ご存知の方がおられましたら教えてください。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

シェル上でCtrl+Z入力した場合は、バックグラウンドに移行するだけのはずですが…
参考:Ctrl+CとCtrl+Zやkillなどの挙動の違いを確認する

killコマンドにも対応する方法としては、以下が参考になります。
参考:How to process SIGTERM signal gracefully?

以下では、Ctrl+Cでもpkill -f hoge.pyによるプロセス終了でもcleanup()が呼ばれます。

Python

1# hoge.py 2# -*- coding: utf-8 -*- 3import time, os, signal 4 5# シグナル監視 6class GracefulKiller: 7 kill_now = False 8 def __init__(self): 9 signal.signal(signal.SIGINT, self.exit_gracefully) # Ctrl+C KeyboardInterrupt捕捉しているなら不要 10 signal.signal(signal.SIGTERM, self.exit_gracefully) # kill process 11 12 def exit_gracefully(self,signum, frame): 13 print(signum) 14 self.kill_now = True 15 16# 終了処理 17def cleanup(): 18 print('cleanup') 19 20# メインの処理 21 22print('start pid[%d]'%os.getpid()) 23killer = GracefulKiller() 24 25try: 26 while True: 27 print('loop...') 28 time.sleep(1) 29 30 if killer.kill_now: 31 break 32 33 print('loop end') 34 35except KeyboardInterrupt: 36 # SIGINTを監視していれば不要 37 print( 'KeyboardInterrupt') 38except: 39 print( 'other') 40finally: 41 # 終了処理 42 cleanup() 43 44print('process end')

投稿2017/06/09 05:39

編集2017/06/09 05:44
can110

総合スコア38233

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

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

IzuShin

2017/06/09 08:54

can110さん、ご回答ありがとうございます。 貼っていただいたソースに signal.signal(signal.SIGTSTP, self.exit_gracefully) # kill process を加える事でコントロールZでGPIO.cleanupをおこなえるようになりました。 ありがとうございます。
can110

2017/06/09 09:10

以下のとおり、Ctrl+Zでのプログラムの動作が変わった点だけ留意ください。 まず、Ctrl+ZではSIGTSTPが送信されますが signal.signal(signal.SIGTSTP, self.exit_gracefully) を追加したことで プログラムが終了するようになったはずです。 しかし普通のプログラム、または修正前のプログラムは一時停止しただけでプロセスは残ります。 そしてfg %1 などで再開できます。
guest

0

投稿2017/06/09 04:32

_Victorique__

総合スコア1392

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

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

IzuShin

2017/06/09 08:55

Victoriqueさん、ご回答ありがとうございます。 私の記述に誤りがあったのかもしれませんが、参考にしたサイトのとおり、finalyに記述するだけでは上手くいきませんでした。 申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問