Tôi đang sử dụng cksum để kiểm tra tập lệnh của tôi thực sự đang chạy một cá thể, thậm chí tôi còn thay đổi tên tệp và đường dẫn tệp .
Tôi không sử dụng bẫy & khóa tệp, vì nếu máy chủ của tôi đột ngột ngừng hoạt động, tôi cần xóa tệp khóa thủ công sau khi máy chủ hoạt động.
Lưu ý: #! / Bin / bash trong dòng đầu tiên là bắt buộc đối với 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
Hoặc bạn có thể mã hóa cksum bên trong tập lệnh của mình, vì vậy bạn không phải lo lắng nữa nếu bạn muốn thay đổi tên tệp, đường dẫn hoặc nội dung của tập lệnh .
#!/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