2017-01-23 20 views
0

私は、pgrepがそれが決してすべきではないにもかかわらず「復帰する」と思われるケースについて、ここでいくつかの記事を読んでいます。キーは、bashとshがどのように機能するかの違いと思われます。私の場合を除いて、私はshが本当にbashへのリンクであることを確認しました。自分自身を返すpgrepの確認

  • 私は、SuSE 12 x86_64の上で実行しているよ
  • /binに/ shが
  • /binに/ bashのをbashにリンクされ、私はRubyのスクリプトを呼び出している本当のバイナリ

ですこのようなのpgrep:

cmd="/usr/bin/pgrep -lf \"#{target}\"" 
    pidList=`#{cmd}` 

は、私が実際に一意に特定の「Javaのプロセスを識別するために、引数を使用していますので、完全なコマンドラインを使用する必要があります。

ここで、何らかの無関係な愚かさのために、返されたpidのそれぞれに対して、すぐにps -pを実行します。しばらくの間、psは時には何も返さないので、大きな悲しみを引き起こしていました。最終的に私はpidのpsがpgrepコマンドを返したケースをキャッチすることができました。しかし、それは、要約するとsh -c "pgrep -f blah"

のようなものpgrepコマンド自体ではなかった。

pgrepコマンド自体を返すことはありません。しかし、shとbashの違いによって、サブシェルが表示されることがあります。しかし、shがbashへのリンクであることを確認したので、動作に違いはありません。

Rubyのバッククォートのために余分なサブコマンドが作成されていて、それは(時にはタイミングの問題のみが)pgrepコマンドで取り上げられるものです。

これは本当の苦痛であり、私が実装した修正が本当に問題を遠ざけることを確かめたいと思います。私が働いているコードを考えると、私はどちらかのRuby内の返された結果をループしながら、「グレップ」を含むすべての結果を捨てる私のコマンド

  • の最後に| grep -v grepを追加
    1. に行きますよスクリプト

    私は#2の方が高速ですが、それでも私はpgrep自体を除外しなければならないということに私は気付きます。

    私は正しいトラックにいるのですか、それとも何か他のものが遊んでいると思いますか?

    ありがとうございました!

  • +1

    'bash'が' sh'として呼び出されるとき、それは 'bash'ではなく' sh'として動作します。 –

    +0

    ああ、それは不足しているパズルピースだろう!ありがとう! –

    答えて

    0

    私の質問にはすでに回答がありますが、正式な回答でこれを閉じます。

    私が行方不明になった情報の一部は、bashのは、SHとして呼び出されたとき

    それはPOSIX shを、bashのないように振る舞うということです。 - JörgW Mittag Jan 23 at 23:31

    はい、pgrepは正常に動作していました。しかし、あなたがバックティックを使ってRubyスクリプトから呼び出すときには、まだ 'pgrep'をフィルタリングする必要があります。

    0

    問題はシェルフレーバーではありません:pgrepを呼び出すシェルプロセスは、

    pgrep -f target | grep -v $$ 
    
    関連する問題