ใช้pgrep
แทน:
pgrep -cxu $USER -f my-tool
ตัวเลือกที่ใช้คือ:
-c, --count
Suppress normal output; instead print a count of matching pro‐
cesses. When count does not match anything, e.g. returns zero,
the command will return non-zero value.
-x, --exact
Only match processes whose names (or command line if -f is spec‐
ified) exactly match the pattern.
-u, --euid euid,...
Only match processes whose effective user ID is listed. Either
the numerical or symbolical value may be used.
$0
หากคุณต้องการที่จะใช้ในสคริปต์ทุบตีว่าการตรวจสอบหากมีการทำงานอยู่แล้วคุณสามารถใช้ ขยายตัวนี้ไปยังเส้นทางของสคริปต์ปัจจุบัน (เช่น/home/username/bin/foo.sh
) foo.sh
แต่เราจำเป็นเท่านั้น เพื่อให้ได้ว่าเราสามารถเอาทุกอย่างขึ้นอยู่กับที่ผ่านมา/
โดยใช้ทุบตีเครื่องมือสตริงการจัดการ${0##*/}
: นี่หมายความว่าเราสามารถทำสิ่งที่ชอบ:
## If there are more than 1 instances of the current script run
## by this user
if [[ $(pgrep -cxu "$USER" "${0##*/}") -gt 1 ]];
then
echo "Script already running, exiting."
exit
fi
คุณอาจต้องการใช้ lockfiles สำหรับสิ่งนี้:
## If the lock file exists
if [ -e /tmp/$USER.foo.lock ]; then
## Check if the PID in the lockfile is a running instance
## of foo.sh to guard against crashed scripts
if ps $(cat /tmp/$USER.foo.lock) | grep foo.sh >/dev/null; then
echo "Script foo.sh is already running, exiting"
exit
else
echo "Lockfile contains a stale PID, continuing"
rm /tmp/$USER.foo.lock
fi
fi
## Create the lockfile by printing the script's PID into it
echo $$ > /tmp/$USER.foo.lock
## Rest of the script here
## At the end, delete the lockfile
rm /tmp/$USER.foo.lock
pidof
มันมีเครื่องมือที่ดีกว่าpgrep