• 締切済み

ラズパイの/etc/rc.localでの自動起動

現在ラズベリーパイ3でpythonで作成したTCP_clientを起動するためにシェルスクリプトを作成して/etc/rc.localに登録し、ラズパイに電源投入で起動と同時にtcp_clientのプログラムが起動するようにしています。 この"tcp_client1_02.py"のpythonプログラムがたまにダウンしてしまう症状が発生していたため、シェルスクリプトでpsコマンドでこのプログラムが起動していなかったら、自動的に再起動するようにするものを作成しました。 (tcp_client1_02_process_check.sh) #!/bin/sh while true do #isAlive=`ps -ef | grep " sudo python /home/pi/Desktop/tcp_client1_02.py " | \grep -v grep | wc -l` #if [ $isAlive = 1 ]:then if ps axww | grep "[s]udo python /home/pi/Desktop/tcp_client1_02.py" >/dev/null then echo "プロセスは生きています" else echo "プロセスは死んでいます" sudo sh /home/pi/python/autorun_script fi sleep 3 done このシェルスクリプトを/etc/rc.localに登録しています。 (/etc/rc.local内) sh /home/pi/python/autorun_script & sh /home/pi/python/tcp_client1_02_process_check.sh & このシェルスクリプトは echo "プロセスは死んでいます" sudo sh /home/pi/python/autorun_script プロセスが死んだ場合にautorun_scriptというシェルスクリプトを起動するようにしているのですが、ラズパイ起動時にこのプログラムはバックグラウンドで動作しているようなので、いつのタイミングでこのルーチンに飛んでいるのかわからないので、 sh /home/pi/python/tcp_client1_02_process_check.sh の後ろの”&”を削除してみて再起動してみたのですが、これでもプログラム動作の表示が出てこないのですが、この動作を表示させてみることは可能でしょうか? ご教示いただきますよう、宜しくお願い致します。

みんなの回答

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.5

>このプロセスは動いているのに、ログが出力されない原因と解決方法をどうぞ、ご教示宜しくお願い致します。 autorun_script の中が無限ループになっているためでは?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>後ろに”&”を付けるとバックグラウンドで起動というのをどこかのサイトで見て真似てみた感じなのですが、あまり動作としては関係なさそうですね。 rc.localでtcp_client1_02_process_check.shを起動するならバックグラウンドで実行するように&付けとかないとrc.localを実行してるシェルはtcp_client1_02_process_check.shの終了を待つと思うのですが(autorun_scriptも同様)。 またバックグラウンドで実行してもrc.localを実行しているシェルの終了時のHUPシグナルによりautorun_scriptとtcp_client1_02_process_check.shは終了してしまいそうな。 私ならpython /home/pi/Desktop/tcp_client1_02.pyを実行して、そのジョブが終了するのをwaitで待機してpython /home/pi/Desktop/tcp_client1_02.pyを実行し直してwaitで待機を繰り返すスクリプトを書いて、それをrc.localにはnoup スクリプト &で実行させるかなぁ。 sudoはrc.localで実行する分には必要ないと思うから省略。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

>これでもプログラム動作の表示が出てこないのですが、この動作を表示させてみることは可能でしょうか? の意味がようやくわかった気がします。スクリプトでechoしたものを見る事が出来るかと言うことでしょうか? /etc/rc.localから起動したのであれば、普通のPCやサーバーのLinuxだとコンソール(/dev/console)に出ますが、ラズベリーパイの場合はどうなるか知りません。 syslogdかrsyslogd が動いているのであれば、「echo プロセスは生きています」の代わりに「logger プロセスは生きています」とすれば、/var/log/messages のファイルに出ます。ただし3秒ごとに出るので/var/log/messagesのサイズが膨大になってしまうと思いますが。 もしくは、echoで出力をファイルにリダイレクトするか。この場合もファイルサイズが膨大になると思います。 少なくとも、生きている場合はメッセージを出さないのが良いかと思いますよ。

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.2

過去の質問ログを少し拝見させていただきましたが cronでシェルスクリプトを定期的に動作させ プロセスチェックというのではだめなんでしょうか? そうすれば while true do sleep 3 done を排除したシェルスクリプトでいけそうですが ただし1分間隔でのチェックになってしまう というのはあります while true で起動時に動かしたシェルスクリプトの中で無限ループ状態を作るより cronでもよいのであればと思いました ※cron登録方法やスクリプト内容の変更で1分以内もできます >表示させてみることは可能でしょうか? シェルスクリプトの中にログを保存し残すように変更を加えるとか その時々ではなくプロセス状態を把握できるようにするのが良いと思います やっつけでもうしわけないですが 公開されているスクリプトに処理を追加するとこんな感じで #!/bin/sh #ログの保存ディレクトリを指定 LOGDIR=ログ保存ディレクトリ while true do #isAlive=`ps -ef | grep " sudo python /home/pi/Desktop/tcp_client1_02.py " | \grep -v grep | wc -l` #if [ $isAlive = 1 ]:then #日付かわったらログファイル名かわります FNAME=`date +%Y%m%d` if ps axww | grep "[s]udo python /home/pi/Desktop/tcp_client1_02.py" >/dev/null then echo "`date +%Y%m%d-%H%M%S` :プロセスは生きています" | tee -a $LOGDIR/${FNAME}.log else echo "`date +%Y%m%d-%H%M%S` :プロセスは死んでいます" | tee -a $LOGDIR/${FNAME}.log sudo sh /home/pi/python/autorun_script fi sleep 3 done

techhouse
質問者

お礼

回答頂きありがとうございます。 大変助かります。 頂きましたシェルスクリプトを ログファイルの出力先を LOGDIR=/home/pi/python として設定して実行してみました。 /home/pi/pythonに20160504.logというテキストファイルが作成されたので、確認してみたところ。 20160504-091914 :プロセスは死んでいます と、この1行が出力されており、TCPのパケットも出力されているので、動作できているようなのですが、3秒ごとにこのログ行が出力されるはずですが、この1行しか出力されません。 再度 $ sudo sh /home/pi/python/test20160504_01.sh で起動をかけるとログファイルに行が追加されるのですが、起動時の1回のみというのがわかりました。 となると、test20160504_01.shのシェルスクリプトが止まっているのでは? と思い、 psコマンドでプロセスを調べてみたところ pi@raspberrypi:~ $ ps aux |grep test20160504 root 552 0.0 0.3 9284 3160 ? S 08:48 0:00 sudo sh /home/pi/python/test20160504_01.sh root 632 0.0 0.0 1912 364 ? S 08:48 0:00 sh /home/pi/python/test20160504_01.sh root 1514 0.0 0.3 8256 3260 pts/0 S+ 09:19 0:00 sudo sh test20160504_01.sh root 1521 0.0 0.0 1912 408 pts/0 S+ 09:19 0:00 sh test20160504_01.sh pi 1580 0.0 0.1 5728 1852 pts/1 S+ 09:29 0:00 grep --color=auto test20160504 このtest20160504_01.shのシェルスクリプトのプロセスは動作中と出てきます。 このプロセスは動いているのに、ログが出力されない原因と解決方法をどうぞ、ご教示宜しくお願い致します。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

> いつのタイミングでこのルーチンに飛んでいるのかわからないので、 /etc/rc.local に書いたのならば、OS起動時に起動されます。

techhouse
質問者

お礼

回答頂きありがとうございます。 sh /home/pi/python/tcp_client1_02_process_check.sh & 後ろに”&”を付けるとバックグラウンドで起動というのをどこかのサイトで見て真似てみた感じなのですが、あまり動作としては関係なさそうですね。 助かります。

関連するQ&A