`ps -ef`が機能するために(nohup'ed)スクリプトが休止状態になる必要があるのはなぜですか?

`ps -ef`が機能するために(nohup'ed)スクリプトが休止状態になる必要があるのはなぜですか?

次の行を含み、ansible(ssh、sudoを介して)によって呼び出されるスクリプトでは、約5回のうち4回は試行中であり、プロセスが永久に実行されているにもかかわらずpsif分岐に達します。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

ベストアンサー1

おすすめ記事