grepコマンドは偽の肯定結果を提供します

grepコマンドは偽の肯定結果を提供します

このコマンドを使用して(ループ内で)特定の名前で実行されているすべてのプロセスの数を取得し、追加の数を決定しますが、時にはすべてのプロセスに誤った答えを提供し、時には同じループ内のいくつかのプロセスに誤った答えを提供します。一部のサーバーではまったく問題ありません。手動で確認してみると間違っていることがわかりました。

check_process() {
    process_count=$(ps -eaf | grep -v grep | grep "$1" | wc -l)
    if [ "${process_count}" -eq 1 ]; then
        PROCESS_EXISTS=0
        echo $1 " is running"
    else
        PROCESS_EXISTS=1
        echo $1 " is not running"
    fi
}

また、問題が発生し始めた過去2〜3ヶ月前までは、ほぼ2年間、見事に働いていたことにも言及したいと思います。

ベストアンサー1

ps -f次の出力を提供します。

chazelas   11042   10528  1 08:49 ?        00:00:03 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 7847 -prefMapSize 699608 -parentBuildID 20200720193547 -appdir /usr/lib/firefox/browser 10528 true tab

grep "$1"多くのアカウントでプロセス名が指定された行を返すのはエラーです。

  • $1で始まると失敗します-grep -e "$1"またはが必要ですgrep -- "$1"。任意のデータをコマンドに渡すときは、オプションの終わりの区切り文字を使用する習慣が必要です。
  • grep一致に正規表現パターンを使用します(例re:)grep。たとえば、grep a.py一致します。を使用して部分文字列を検索aspyできます。grep -F
  • ps -f報告プロセスなし名前しかし、そのプロセスは議論argv[0]一般的には、慣例に従ってコマンドであるパスを含む)
  • 一致する行内の位置を制限せずに正規表現/サブ文字列を探しています。たとえば、上記の$1==はでas一致しますas。または、以外のパラメータと一致する可能性があります。chazelasargv[0]
  • grep | wc -lはいgrep -c

これには、名前(またはその他の重要な基準)でプロセスを一致させる(非標準ですが非常に一般的な)コマンドがあります。pgrep

pgrep -xc -- "$1"

cどのプロセスが計算されますか?名前ps(withoutが報告したように-f)exは正規表現と正確に一致します$1。プロセス名の代わりに引数の完全なリスト(で報告されているように)を一致させるには-f、を使用します。pgrepps -f

これにより、正規表現演算子を含むプロセス名の問題が発生します(上記のように.)。残念ながら、正規表現一致ではなく文字列比較を実行するオプションがpgrepないため、正規表現演算子をエスケープする必要があります。-F

別のオプションは、ps報告するプロセス名のみを指定してから、それを使用して固定文字列比較をgrep -xF実行することです。xF

ps -Ao comm= | grep -Fxce "$1"

プロセス名の代わりに引数リスト(切り捨てることができますが、一部の実装では、1つ以上の引数が行の長さ制限を増やすことがある)を印刷することに置き換えられcommました。argsps-w

いずれにせよ、すべてのユーザーはすべての名前とパラメータのリストを使用してプロセスを作成できるため、名前でプロセスを見つけることは非常に脆弱です。誰もが同じ名前と同じパラメータのリストでプロセスを開始し、まったく異なるコマンドを実行することで、プロセスがそこにあると思うように欺くことができます。

通常、プロセスによって提供されるサービスの可用性を確認するか、現在使用中の一部のリソースを予約することをお勧めします。

-u場合によっては、有効なuid(in pgrep)または現在実行中の実行可能ファイルへのパスなどの追加基準を検索に追加できます。

Linuxでは、以下を使用してくださいzsh

pids=(/proc/<->(Nnu[chazelas]e['[[ $REPLY/exe -ef /usr/bin/sleep ]]']:t]))

$pidsたとえば、ユーザーはコードを実行しているプロセスのIDとしてファイルに保存され、それを使用してリストが空でないことを確認できます。 (検索でコマンドをまたはに置き換えます)。/usr/bin/sleepchazelasif (($#pids > 0)); then.../usr/bin/sleep=sleep$commands[sleep]sleep$PATH

より一般的には、サービス管理者に依存してサービスとプロセスを管理するのが最善です。このような近代的な装置は、systemdそれを安定して実行するための設備を提供します。

おすすめ記事