私の答えは、「ps」リストで「foobar」を検索するための典型的な答えのバリエーションです。「-A」「ps」の引数は「aux」よりも移植性が高いと思いますが、この変更は答えとは無関係です。典型的な答えは次のようになります。
$ ps -A -ww | grep [f]oobar
代わりに、次のパターンを使用します。
$ ps -A -ww | grep [^]]foobar
主な利点は、静的パターン "[^]]"を探しているパターンと単純に連結するだけなので、このパターンに基づいてスクリプトを記述しやすいことです。文字列の最初の文字を取り除き、それを角括弧の間に挿入し、それを再び連結する必要はありません。シェルでスクリプトを作成するときは、探しているパターンの前に「[^]]」を貼り付ける方が簡単です。Bashでの文字列スライスは見苦しいため、私のバリエーションではそれを避けています。このバリエーションは、パターンが先頭の右角かっこなしで一致する行を表示すると言います。角かっこを除外する検索パターンは実際に角かっこをパターンに追加するため、一致することはありません。
したがって、次のように移植可能な「psgrep」コマンドを作成できます。ここでは、Linux、OS X BSD、その他の違いを考慮します。これにより、「ps」の列ヘッダーが追加され、ニーズに合ったよりカスタムな「ps」形式が提供され、余分な、非常に広いリストプロセスが表示されるため、コマンドライン引数が失われることはありません。まあ、ほとんどが見逃されていません。JavaはJavaであるため、可能な限り最悪の方法で処理されることが多いため、一部のJavaサービスは、プロセステーブルが追跡する引数の最大許容長を超えて実行されます。これは1024文字だと思います。プロセスを開始するために許可されるコマンドローンの長さははるかに長くなりますが、カーネルプロセステーブルは1Kを超える長さを追跡しません。コマンドが開始されると、コマンド名と引数リストは '
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
ps aux |grep
でpgrep
(またはpgrep -f
)。