KornShellのAIX 7.1.0で実行されているプロセスを確認する正確で信頼性の高い方法

KornShellのAIX 7.1.0で実行されているプロセスを確認する正確で信頼性の高い方法

私は何かが実行されている間にスクリプトの他のインスタンスがないことを確認したいので、スクリプトが実行されているかどうかを確認する方法を見つけようとしました。これまで私は次のことを試しました。

#! /bin/ksh93

getProcessNum(){
    processNum=$(ps -ef | grep -E "$1" \
        | grep -vE "emacs|vi |ve |grep|ps|tail|tee|runProcess|jlast|tlast|elast" \
        | awk '/'$USER'/ { if($1 == "'$USER'") print $0}' \
        | awk -v myPid=$$ '{if ($3 != myPid) print $0}' \
        | wc -l
    )
}

getProcessNum "myAvoidedScript.k"

if [[ $processNum -gt 1 ]]; then
    echo "There are $processNum instances running. Stopping..."
else
    echo "You can continue"
fi

わかりました:

ThisProcessID=4063450
myUser  4063450  5636606   0 19:06:48 pts/10  0:00 /bin/ksh93 myAvoidedScript.k
myUser  8978492  5964234   0 19:06:48 pts/10  0:00 /bin/ksh93 myAvoidedScript.k
myUser  3277270  9109712 113 11:07:58  pts/5 70:50 /bin/ksh93 myAvoidedScript.k

この方法で十分だと思いますが、一部のプロセスは同じスクリプトの一部でも計算されます。このスクリプトを実行しようとすると、何も実行されませんが、1より大きい数値が返されることを確認しました。

それで、私は非常に正確な時間に始まる重複した項目を削除しようとすれば十分であると言いました。私は次のように試しました。

#! /bin/ksh93

getProcessNum(){
    processNum=$(ps -ef | grep -E "$1" \
        | grep -vE "emacs|vi |ve |grep|ps|tail|tee|runProcess|jlast|tlast|elast" \
        | awk '/'$USER'/ { if($1 == "'$USER'") print $0}' \
        | awk -v myPid=$$ '{if ($3 != myPid) print $0}' \
        | sort -k 4 | awk '!x[$5]++' | wc -l
    )
}

getProcessNum "myAvoidedScript.k"
if [[ $processNum -gt 1 ]]; then
    echo "There are $processNum instances running. Stopping..."
else
    echo "You can continue"
fi

時には正しい結果が得られますが、時には次のような結果が得られます。

返されたPIDは、常に現在のPID($$)と同じではありません。

ThisProcessID=4063450
myUser  3177476  5964232   0 19:06:49 pts/10  0:00 /bin/ksh93 myAvoidedScript.k
myUser  3277270  9109712 113 11:07:58  pts/5 70:50 /bin/ksh93 myAvoidedScript.k

このスクリプトをほぼ1秒間実行しても、まったく同じスクリプトの2つのインスタンスが表示され続けます。

ThisProcessID=4063450
myUser  4063450  5636606   0 19:07:48 pts/10  0:00 /bin/ksh93 myAvoidedScript.k
myUser  5177476  5964232   0 19:07:49 pts/10  0:00 /bin/ksh93 myAvoidedScript.k
myUser  3277270  9109712 113 11:07:58  pts/5 70:50 /bin/ksh93 myAvoidedScript.k

このスクリプトを実行するたびに、正しいプロセスのみを安定した方法で実行する方法を知っている人はいますか?

PS。フラグファイルが利用可能であることを知っていますが、これは多くのスクリプトを変更する必要があることを意味します。

ベストアンサー1

これをテストするAIXシステムはありませんがpspsgrep、awk、wc を単一の awk コマンドに減らすこともできます。例えば、

getProcessNum(){
    procs=$(ps -u "$USER" -f)
    processNum=$(printf '%s\n' "$procs" |
        awk -v myPid="$$" -v name="$1" '
            index($0,"ksh93 " name) != 0 && $2 != myPid {tot++}
            END {print tot}'
    )
}

おすすめ記事