मैं अपनी स्क्रिप्ट की जांच करने के लिए cksum का उपयोग कर रहा हूं, वास्तव में एकल उदाहरण चल रहा है, यहां तक कि मैं फ़ाइल नाम और फ़ाइल पथ भी बदलता हूं ।
मैं ट्रैप एंड लॉक फ़ाइल का उपयोग नहीं कर रहा हूं, क्योंकि यदि मेरा सर्वर अचानक डाउन हो जाता है, तो सर्वर के ऊपर जाने के बाद मुझे मैन्युअल रूप से लॉक फ़ाइल को हटाने की आवश्यकता है।
नोट: #! / बिन / बैश पहली पंक्ति में grep ps के लिए आवश्यक है
#!/bin/bash
checkinstance(){
nprog=0
mysum=$(cksum $0|awk '{print $1}')
for i in `ps -ef |grep /bin/bash|awk '{print $2}'`;do
proc=$(ls -lha /proc/$i/exe 2> /dev/null|grep bash)
if [[ $? -eq 0 ]];then
cmd=$(strings /proc/$i/cmdline|grep -v bash)
if [[ $? -eq 0 ]];then
fsum=$(cksum /proc/$i/cwd/$cmd|awk '{print $1}')
if [[ $mysum -eq $fsum ]];then
nprog=$(($nprog+1))
fi
fi
fi
done
if [[ $nprog -gt 1 ]];then
echo $0 is already running.
exit
fi
}
checkinstance
#--- run your script bellow
echo pass
while true;do sleep 1000;done
या आप अपनी स्क्रिप्ट के अंदर cksum हार्डकोड कर सकते हैं, इसलिए आपको कोई चिंता नहीं है अगर आप अपनी स्क्रिप्ट का फ़ाइल नाम, पथ या सामग्री बदलना चाहते हैं ।
#!/bin/bash
mysum=1174212411
checkinstance(){
nprog=0
for i in `ps -ef |grep /bin/bash|awk '{print $2}'`;do
proc=$(ls -lha /proc/$i/exe 2> /dev/null|grep bash)
if [[ $? -eq 0 ]];then
cmd=$(strings /proc/$i/cmdline|grep -v bash)
if [[ $? -eq 0 ]];then
fsum=$(grep mysum /proc/$i/cwd/$cmd|head -1|awk -F= '{print $2}')
if [[ $mysum -eq $fsum ]];then
nprog=$(($nprog+1))
fi
fi
fi
done
if [[ $nprog -gt 1 ]];then
echo $0 is already running.
exit
fi
}
checkinstance
#--- run your script bellow
echo pass
while true;do sleep 1000;done