web-dev-qa-db-ja.com

grepコマンドのガベージオプションエラーを回避する方法

サーバーでプロセスが実行されているかどうかを確認する必要があります。しかし、課題は、私が使用しているキーワードがユーザーIDではなく、o/pまたはpsコマンドの一部であることです。

ps -ef | grep -v $$ | grep xenonとして実行すると、次のようになります

エラー:ガベージオプション

使用法:ps [オプション]

追加のヘルプテキストについては、「ps --help」または「ps --help」を試してください。

詳細については、ps(1)を参照してください。キセノンが実行されていません。エラーを確認してください:ガベージオプション

サーバーで、何らかの理由でpgrepのo/pが表示されないため、問題が解決します。彼はサーバーからのo/pです。

$ps -ef | grep xenon
venom   3157  95310  0 23:08 pts/5    00:00:00 grep --color=auto xenon
root      45943      1  0 Apr12 ?        00:17:47 /opt/xenon/sganet/agent/lib64/sganetwatchdog -vm=/opt/xenon/sganet/agent/lib64/sganetos -logdir /opt/xenon/sganet/log -ini ../conf/ruxitwatchdog.ini
root      45981  45943  2 Apr12 ?        08:20:31 /opt/xenon/sganet/agent/lib64/sganetos -Dcom.compuware.apm.WatchDogTimeout=9000 -Dcom.compuware.apm.WatchDogPort=5000
$pgrep xenon
$pgrep -c xenon
0
$

サーバーで実行されている複数のプロセスを検証するためにチェックするために基本的に記述したスクリプトは次のとおりです。

#!/bin/bash
set +x
USER=`whoami`
#pg='ps -ef | grep -v $USER | '
pg='ps ax | grep -v grep | '
#--------function to check process ---------#
check_process() {

  $pg $1 >/dev/null && echo -e "$1 is running" || echo -e "$1 is not running, please check "
}

#--------Checking process on the server---------#

echo -e "\n\n checking the processes"
check_process xenon
check_process upnew
2
Vajra

シェルパラメータの展開が発生しますafterパイプの高レベルの解析 行を構造化されたコマンドに分割するため、関数本体は記述したように実行されます

ps ax '|' grep -v grep '|'

-つまり、パイプをpsへのリテラル引数として使用します。そのため、エラーが発生しますfrom psgrepではなく!)が|引数。

あなたはそれをいくつかの方法で修正することができます:

  1. pg変数を使用する代わりに、コマンドを関数に書き込むだけです。これは私にとって最良のバージョンのようですが、実際のスクリプトはより複雑になる可能性があります。
  2. そのようなものが本当に必要な場合は、代わりに関数を使用してパイプラインを含めます。

    pg_cmd_1() {
        ps ax | grep -v grep | $1
    }
    pg=pg_cmd_1
    

    そのまま続行します。これにより、追加の関数を定義し、pg変数を動的に変更して、必要に応じてそれらを使用できます。


さらに、現在記述されているように、スクリプトはps ax | grep -v grep | xenon、私はまだあなたが望むものではないと思います(grepがありませんか?)。

3
Michael Homer