プロセスを監視するシェルスクリプトのエラー

このQ&Aのポイント
  • TCPサーバーに対してクライアントが動作しているか確認するためのプログラムを作成中
  • プログラムを起動する時としない時があり、正常に動作しているか確認したい
  • 起動するとエラーが発生し、Syntax error: "done" unexpectedと表示される
回答を見る
  • ベストアンサー

プロセスを監視するシェルスクリプトのエラー

現在作成している定期的にTCPサーバーに対してクライアントが動作しているかどうかを知らせるためパケットを送信するプログラムをpythonで作成し、ラズパイ起動時に自動起動でこのプログラムを起動しているのですが、起動する時としない時があるのでこのプロセスが正常に動作しているかどうかを確認したく、このようなプログラムを作成しました。 (tcp_client1_02_process_check.shの内容) #!/usr/bin/sh while true do #ここではftpdのプロセス監視 isAlive=`ps -ef | grep " sudo python /home/pi/Desktop/tcp_client1_02.py " | \ grep -v grep | wc -l` if [ $isAlive = 1 ]; then echo "プロセスは生きています" else echo "プロセスは死んでいます" sudo /home/pi/python/autorun_script fi sleep 3 done このプログラムはこのサイトを参考にさせて頂きました。 Linux上のプロセスを監視して、プロセスがダウンしたら再起動させるShell http://tech.thekyo.jp/linux%e4%b8%8a%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e7%9b%a3%e8%a6%96%e3%81%97%e3%81%a6%e3%80%81%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%8c%e3%83%80%e3%82%a6%e3%83%b3%e3%81%97/91/ このプログラムを sh tcp_client1_02_process_check.sh これで起動すると次のようなエラーが出てきます。 tcp_client1_02_process_check.sh: 14: tcp_client1_02_process_check.sh: Syntax error: "done" unexpected (expecting "then") このエラーどのようなエラー内容なのでしょうか? どうぞ、ご教示いただきますよう宜しくお願い致します。

質問者が選んだベストアンサー

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

コピペしてCentOSで動かしてみましたが、エラーは出ないです。 #!/usr/bin/sh while true do if ps axww | grep " [s]udo python /home/pi/Desktop/tcp_client1_02.py " >/dev/null then echo "プロセスは生きています" else echo "プロセスは死んでいます" sudo /home/pi/python/autorun_script fi sleep 3 done でどうでしょうか?

techhouse
質問者

お礼

回答頂きありがとうございます。 いただいたシェルスクリプトをtest20160501.shというファイルに保存し、 $ sh test20160501.sh これで実行してみたのですが、 test20160501_01.sh: 12: test20160501_01.sh: Syntax error: "done" unexpected (expecting "then") このようなエラーが出て起動できませんでした。

techhouse
質問者

補足

回答頂きありがとうございます。 教えていただきましたシェルスクリプトが私のラズパイ3で動くことを確認できました。教えて頂きました。コードをコピーしてleafpadにペーストで保存する方法でシェルスクリプトのファイルを作成していたのですが、一度改行コードを”LF”に設定して上書き保存したら動き出しました。多分改行コードってやつが問題だったようです。 (ラズパイ3で動作を確認したシェルスクリプト) #!/usr/bin/sh while true do 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 それと、私が質問で出していたif文箇所 isAlive=`ps -ef | grep " sudo python /home/pi/Desktop/tcp_client1_02.py " | \ grep -v grep | wc -l` if [ $isAlive = 1 ]: then このようにしても動作していることも確認できました。 助かります。

関連するQ&A

  • ラズパイの/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 の後ろの”&”を削除してみて再起動してみたのですが、これでもプログラム動作の表示が出てこないのですが、この動作を表示させてみることは可能でしょうか? ご教示いただきますよう、宜しくお願い致します。

  • プロセス監視

    VisualBasic6.0でWindows2000上で動くプロセス監視プログラムを開発しています。 監視対象a.exe(仮)を起動させた際に取得したPIDを元に起動状態の監視を行っているのですが、ひとつ気がかりとなっていることがあります。 a.exe(仮)エラー停止直後に、他のプロセスb.exeが起動した際に、a.exe(仮)に割り振られていたPIDがb.exeのプロセスに割り当てられ、プロセス監視プログラムがa.exe(仮)の停止を検知できないという可能性はないでしょうか? WindowsでPID割当ての仕組みにお詳しい方、教えてください。 宜しくお願いします。 尚、a.exe(仮)は起動引数付でマルチ起動させるためプロセス名で起動状態を監視することは出来ません。

  • ラズパイ起動時にpythonを自動起動したい

    pythonで作ったサーバーPCに対して、数十秒ごとにラズパイが正常に動作しているかサーバーに知らせるために1kbyte程度のパケットを送信するプログラムをラズパイに電源を入れたと同時にバックグラウンドで起動したいです。 ラズベリーパイ:起動時に自動実行したい http://torisky.com/%e3%83%a9%e3%82%ba%e3%83%99%e3%83%aa%e3%83%bc%e3%83%91%e3%82%a4%ef%bc%9a%e8%b5%b7%e5%8b%95%e6%99%82%e3%81%ab%e8%87%aa%e5%8b%95%e5%ae%9f%e8%a1%8c%e3%81%97%e3%81%9f%e3%81%84 こちらのサイトに載っている内容などを参考に /etc/rc.localのファイルの中に sh /home/pi/python/autorun_script & という行を追加しました。 autorun_scriptの内容は --------------------------------------------------------------------------- #!/bin/sh sudo python /home/pi/Desktop/tcp_client1_02.py while true do : done ----------------------------------------------------------------------------------------- シェルスクリプトの書き方はこちらのサイトを参考にしました。 http://qiita.com/inaBowBow/items/dca01622d086f113db00 このような設定をしてみたのですが、ラズベリーパイをrebootで再起動してもこのプログラムが動作していないようで、サーバーに対してパケットが送信されません。 どうやればこのpythonのプログラムを自動実行することができるようになるのかご教示いただきますよう、宜しくお願い致します。

  • プロセスのハンドルを確保

    AプログラムからBプログラムを起動するプログラムを作成しています。 AはループでBプログラムを起動するのですが、Aでプロセスの起動数をチェックし、飽きのプロセスハンドルを確保しBプログラム意を起動する際にAで確保したハンドルを使用して起動するような処理をするにはどうしたらいいでしょうか? 例:プロセス最大起動数:5   Aは10回ループし、Bを起動する。   Aでプロセスハンドルを5個確保する。   Bを起動する際に確保したハンドルを1個使用する。   Bが終了したらハンドルを解放する。   

  • system関数でのシェル起動について

    system関数でシェルコマンドを発行しているC言語のプログラムがあります。 起動されるシェルコマンド(Cシェル)は2重起動防止のため以下の様にコマンド名をgrepしてPIDを取得し、2つ以上あると2重起動と見なしてコマンドを終了させています。 ps -aef | grep 自身のコマンド名 | grep -v grep ~ この時1回目の起動であるのに2重起動チェックに引っかかってしまいコマンドが実行されませんでした。 デバッグしたところ"csh コマンド名"のPIDとは別に一瞬"sh -c コマンド名"というプロセスがあってそれのPIDと合わせて2つに起動していると見なしていました。 調べたところsystem関数はsh経由(sh -c)でコマンドを実行するためだと言う事が分かり納得出来ました。 また元々バックグラウンドで起動させたいコマンドだったので以下の様に"&"を付与したところ2重起動チェックには引っかからなくなりました。 system("コマンド名 &") バックグラウンド起動させても2重起動チェックで弾かれれば納得出来るのですが、通常の起動と何が違うか分からずに釈然としません。 良く分かりませんが、通常起動だとオーバーヘッドで実行に時間がかかりチェックで弾かれるけど、バックグラウンドだと一瞬で起動されてたまたま上手く行った様に見えるだけだったりするなどなのでしょうか?? もしご存知の方がいらっしゃいましたらご教示頂けると幸いです。

  • サーバプロセスとクライアントプロセスの通信

    サーバプロセスとクライアントプロセスの通信がどのように行われているのか確認させてください。 現在、以下の認識でいます。 (1)TCPコネクション  サーバ側ポート番号【23】と、それぞれのクライアント側ポート番号【****】との間に確立する。   (2)通信処理  クライアント側のプロセスAは、サーバ側のプロセスA(子)  クライアント側のプロセスBは、サーバ側のプロセスB(子)  クライアント側のプロセスCは、サーバ側のプロセスC(子)  との間で通信を行う。 ※添付の図も参照ください。 認識に相違ないでしょうか。 サーバプロセスとクライアントプロセスの通信を行う際、プロセス間(ポート間?)の通信には、IPアドレスとポート番号を組み合わせたソケットを用いるため、サーバ側ではソケット【192.168.0.1:23】を1個作成し、クライアント側ではソケット【192.168.0.2:****】をプロセス分作成すると考えています。 このとき、クライアントプロセスAはサーバプロセスA(子)と通信を行いますが、サーバ側で作成されているソケットは1つであるため、どの子プロセスに対してデータをせばいいのか判別できないのではないかと考えています。 ※クライアントプロセス(A、B、C)はソケット(サーバ側)【192.168.0.1:23】に対して送信されるため。 上記について、何らかの仕組みがあるのでしょうか。 よろしくお願いします。

  • FEDORA 4 MySQL プロセス 死活監視

    タイトル通り、mysqld のプロセスがなければ、管理者宛にメールを送りたいと考えています。また、シェル又は、PHPをcron(1分間隔)で定期実行もあわせて考えています。 考えたシェル:mysqlch.sh #!/bin/bash mail_body_tmp=/tmp/ps_chk.tmp MAIL_TO=root@localhost rm -f $mail_body_tmp for PROC in $@ do ps -ef | awk {'print $8'} | grep $PROC | grep -v grep | grep -v $0 1>&2>/dev/null if [ ${?} -ne 0 ] ; then echo Process \"$PROC\" Down in $HOSTNAME >> $mail_body_tmp fi done if [ -e $mail_body_tmp ]; then mail -s "Process Down Information. $HOSTNAME" $MAIL_TO < $mail_body_tmp logger -t svchk < $mail_body_tmp fi 実行するときは、mysqlch.sh mysqld しかし、プロセスDOWNでも、メールがきません。 修正する所、またはこの方がいいというアドバイスお願いいたします。

  • 外部プロセス起動時に発生するエラーについて

    外部プロセス起動時に発生するエラーについて お知恵を拝借させてください。 あるプロセス(以下A)から同一端末上の別プロセス(以下B)を起動する場合に、 エラーが発生します。 エラーの内容は、参照オブジェクトが作成されていないという内容です。 このエラー自体については納得はできるのですが、 プロセスBの直接起動の場合、このエラーは発生せず、正常に動作します。 別プロセスからの起動と、直接起動で、 内部的な動作の違いがあるのかもと想像しているのですが、 確認の方法がわからず、困っています。 解決の為の方法、ヒントか糸口など、 もしご存知の方がいらっしゃいましたら教えていただきたいのです。 プロセスA、B双方ともVB2008による開発です。 よろしくお願いします。

  • シェルスクリプトで、サーバー監視

    まだまだスクリプト初心者なので、教えていただきたいのですが、 条件分岐させるifがあると思うのですが、 「サーバーのロードアベレージが1から2の時にトップを保存して、  2を超える時はサーバーを再起動させる。1以下の場合はログ保存する。」 というスクリプトを書きたいのです。 #!/bin/sh AVERAGE=` awk '{gsub(/[.]/,""); print $1}' /proc/loadavg` if [ $AVERAGE > 100 && $AVERAGE < 200 ] ;then top -b -n1 >> ./top if [ $AVERAGE -gt 200 ] ;then shutdown -r now end uptime >> ./top.log 上記のままだとerror: unexpected end of fileと エラーが出てしまいます。ifが2つ入ってるので 正しい記述が必要だと思うのですが、 どうしたらよいでしょうか

  • ラズパイ起動時にIPアドレスをメールで取得したい

    raspberry piの操作などは自分のwindows PCからTeraTermのSSHでログインして行いたいと思っています。 そこで、ラズパイに電源を入れてOSが起動完了したら、自分のメールアドレス宛にDHCPサーバから取得したIPを通知してほしいと思い、次のサイトのサンプルコード例を参考にしました。 IPアドレスの通知 https://raspberrylife.wordpress.com/2013/02/06/ip%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%81%ae%e9%80%9a%e7%9f%a5/ @tokoyaさんから メール送信アカウントは自分の所有するgmailアカウントを使用しています。 ここで作成したMyIP.pyのpythonコードを pi@raspberrypi $sudo python /home/pi/PythonProjects/MyIP.py これで実行したところ、自分のメールアカウントにIPの通知ができることを確認しました。 そこで、電源起動時にこのコードを動作させるために sudo nano /etc/rc.local で、次のようにrc.local内にMyIP.pyを自動起動するように設定しましたが、電源投入時にメールが送信されてきません。 修正方法等をご教示頂きますよう、よろしくお願い致します。 #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi sudo python /home/pi/PythonProjects/MyIP.py exit 0