BashでCtlr-cを実現。指定時間で指示したコマンドを停止するコマンド

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秒後にプログラムが止まりました。すばらしい。

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

まず、下記の shell を作ります。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

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

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

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

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

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

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

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

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

概ね、5時間くらい動き続けていたようです。

原因は、sudo の前に exec 指定が無かったためでした。参考とするコマンドは、よく見て間違えないようにやりましょう。

3.同一機能のコマンド timeout

色々ググって作成した上記の stopafter ですが、ラズパイのOSを scratch に上げたところ、どういう訳か正常に機能しなくなりました(ラズパイ電光掲示板用のOSをJessieからstretchにバージョンアップした最終頁)。

原因は未だに判明していません。

ほおって行くわけにもいかず、似たようなコマンドがないか探ったところ、何とコマンドの中に全く同じ機能を持っているものが見つかりました。

timeout コマンドです!

stopafter と同様に後ろに数字を書けば、書いた時間が経過したのちに停止してくれます。

コマンドですので、使い勝手もいいです。そのため、現在では stopafter を使用していたものを timeout に変更しました!