お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-01-17 00:38:54

anjyu
メンバ
登録日: 2007-10-06

プロセスを監視してアプリを起動するシェルスクリプト

 Skypeで自宅の監視をしていますが、ときどきSkypeが落ちることがあります。この時に自動でSkypeを起動させるためにプロセスをチェックし、SkypeのプロセスがなければSkypeを起動するように下記のシェルスクリプトを書きましたが上手く動作しません。
ps -ef|grep skype|grep -v grep|wc -l
では、「1」と返してくるのですが、処理2のelseに進まずskypeが起動してきます。
下記のシェルスクリプトの何処が問題なのか分かりません。

#!/bin/sh
pcount=`/usr/bin/ps -ef|grep skype|grep -v grep|wc -l`
if [ $pcount = 0 ]; then
  skype &
else
  echo No skype
fi

【環境】

ubuntu 10.04
Skype β 2.2.0.35


 以上、宜しくお願い致します。

オフライン

 

#2 2012-01-17 01:30:46

yama
メンバ
登録日: 2006-10-23

Re: プロセスを監視してアプリを起動するシェルスクリプト

答えではありませんが、こんなのはどうでしょう?

コード:

ps -C skype -o comm= > /dev/null || /usr/bin/skype &

オフライン

 

#3 2012-01-17 02:11:10

hellfire
メンバ
From: 日本/神奈川県
登録日: 2006-11-21

Re: プロセスを監視してアプリを起動するシェルスクリプト

anjyu 様へ.

ps ... のところは問題ない….
となると,問題は後の if 文ということになります.

結論としては,シェルスクリプトで if 文の条件文で
数値を比較する場合は = ではなく -eq を使います.
= は文字列の比較の際に使います.
もし文字列で比較する場合は,$pcount と 0 をクォーテーションで囲む必要があります.


あと,流儀的なものもあるかもしれませんが,
パイプやリダイレクトの前後にはスペースを入れた方が,
デバッグや予期せぬエラーに出会わなくていいと思います.

また,この場合は問題ないかもしれませんが,
シェバンク行(1行目)は,#!/bin/sh よりも #!/bin/bash にした方が良いと思います.
(どういうことか理解して,意図的にそうしているのであれば,良いのですが…)
Ubuntu では,/bin/sh はデフォルトで /bin/dash というものが使われることになります.
簡単に説明すると dash は,bash の軽量版みたいなものです.
従って,bash と dash では所々,文法の解釈が異なるので,予期せぬ結果を招くことがあります.

オフライン

 

#4 2012-01-17 08:05:54

anjyu
メンバ
登録日: 2007-10-06

Re: プロセスを監視してアプリを起動するシェルスクリプト

yama による投稿:

答えではありませんが、こんなのはどうでしょう?

コード:

ps -C skype -o comm= > /dev/null || /usr/bin/skype &

  yama様

 新たなコードを有難うございます。
同じ事をこんなに簡潔なコードで書けるんですね。
もっと勉強をしたいと思います。
今後もアドバイスを宜しくお願い致します。

オフライン

 

#5 2012-01-17 08:12:35

anjyu
メンバ
登録日: 2007-10-06

Re: プロセスを監視してアプリを起動するシェルスクリプト

hellfire による投稿:

また,この場合は問題ないかもしれませんが,
シェバンク行(1行目)は,#!/bin/sh よりも #!/bin/bash にした方が良いと思います.
(どういうことか理解して,意図的にそうしているのであれば,良いのですが…)
Ubuntu では,/bin/sh はデフォルトで /bin/dash というものが使われることになります.
簡単に説明すると dash は,bash の軽量版みたいなものです.
従って,bash と dash では所々,文法の解釈が異なるので,予期せぬ結果を招くことがあります.

 hellfire様

 問題は、/bin/shここでした。
#!/bin/bash で考えていた動作をしました。
基本的なところで見過ごしていました。
また、数値を比較する場合は = ではなく -eq を使うことも知りませんでしたので、勉強になりました。
ご指摘を有難う御座いました。

  今後とも宜しくお願い致します。

オフライン

 

Board footer

Powered by FluxBB