shellで Ctrl-c を実現した!最初はミスって電光掲示板5時間動きっぱなし

1.shellで Ctrl-c を実現

shellで、Ctrl-C に代わる操作をやることができるのか、前から気になっていたのですが、ググったら、いいのが見つかりました。

(sleep 5;kill $$)& をコマンドの前に挿入すると5秒後に指定したコマンドが止まります。

つまり、killされることでコマンド実行が停止します。

電光掲示板で提供される python のサンプルプログラムは、時間指定できないものが多いので、これが使用できるとサンプルプログラムを使う幅が広がりますね。

早々試してみました。

次の shell を作成し、kill_sample.sh と名付けます。

!/bin/sh
(sleep 10;sudo kill $)&
exec sudo python3 pulsing-brightness.py -r 16 -c 2 --led-no-hardware-pulse yes

実行結果です。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ ./kill_sample.sh
Press CTRL-C to stop sample

10秒後にプログラムが止まりました。すばらしい。

汎用化の方法も、さきほどのページに載っています。

まず、下記を作ります。60爺は、stopafter と命名しました。

#/bin/sh
x=$1
shift
(sleep $x; sudo kill $)&
exec "$@"

この stopafter を使用して、次の二つの操作を電光掲示板に表示する shell を作成しました。

#/bin/sh
./stopafter 10 sudo python3 simple-square.py -r 16 -c 2 --led-no-hardware-pulse yes
./stopafter 10 sudo python3 pulsing-colors.py -r 16 -c 2 --led-no-hardware-pulse yes

2.失敗談:電光掲示板5時間起動!

実は、最初はこんなコマンドでやってました。

#/bin/sh
(sleep 10;sudo kill $)&
sudo python3 pulsing-brightness.py -r 16 -c 2 --led-no-hardware-pulse yes

このため、python のプログラムが止まらず、電光掲示板がずーっと動きつづけていたんですよ。

家に帰って、書斎の中が赤や緑や青で光り輝いているのに気づきました。

概ね、5時間くらい動き続けていたようです。原因は、sudo の前に exec 指定が無いがなかったためでした。参考のコマンドはよく見て、間違えないようにやりましょう。

実行時、下記のように、Terminatedが表示され、これでうまくkillされたと勘違いしてしまいました。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ ./kill_sample.sh
Press CTRL-C to stop sample
Terminated

まア、勉強にはなりましたけど。

参考
BashでCtrl-cを実現したい