私は何かが実行されている間にスクリプトの他のインスタンスがないことを確認したいので、スクリプトが実行されているかどうかを確認する方法を見つけようとしました。これまで私は次のことを試しました。
#! /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システムはありませんがps
。ps
grep、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}'
)
}