
次の行を含み、ansible(ssh、sudoを介して)によって呼び出されるスクリプトでは、約5回のうち4回は試行中であり、プロセスが永久に実行されているにもかかわらずps
if分岐に達します。grep
この場合、Count:
「0」がエコーされます。
PROC=[a]sdf # brackets, so we don't grep the grep process itself
# sleep 0.1
PID=(`ps -ef|grep -E "$PROC"|awk '{print $2}'`)
PIDLEN=`echo "${#PID[@]}"`
if [ "PIDLEN" -ne 1 ]; then
echo \"$PROC\" does not designate a single, unique process. Count: "$PIDLEN"
ここで興味深いのは、 "sleep 0.1"行のコメントアウトを削除してもif分岐に達しないことです。これは私が期待したものです。
このスクリプトは、関連する可能性があるnohupを使用して分離モードで起動されます。スクリプトは次のとおりです。
- shell:
cmd: nohup ./script.sh </dev/null >/tmp/out 2>/tmp/err &
修正する
私の質問とは関係ありませんが、コメントに誰かがこれが常にコンボpgrep
より優れていると思うようです。ps|grep
これが必ずしもそうではないことを証明するために - これが実際に私がここでpgrepを使用していない理由です - Debian 10でこれを試してみてください。
$ sleep 1000 $(seq 1 1200)|wc -c&
[1] 13821
$ ps -ef|grep [1]200|wc -l
1
$ pgrep -f 1200|wc -l
0
$ pgrep -f 1038|wc -l
1
$ pgrep -f 1039|wc -l
0
$ pgrep -af 1038|wc -c
4102 # 5-digit PID + SPACE + 4096 chars
$ ps -ef|grep [1]200|wc -c
4952
これは、pgrep greps / printsがプロセスあたり4096文字だけを印刷し、ps -efがそれ以上を印刷することを示しています。 (数値を取得するためにps | greppingすることは一般的に安全ではありませんが、ポイントを証明するために使用しました。)
上記のすべては、このDockerfileを使用している誰でも簡単に確認できます。
FROM debian:10
RUN apt-get clean
RUN apt-get update
RUN apt-get install -y --no-install-recommends procps
次のコマンドを使用してビルドして実行できます
docker build -t debian10-pgrep-vs-ps .
docker run --rm -it debian10-pgrep-vs-ps