在执行定时任务脚本频率比较快,并不知道上一次的脚本是否真正执行完毕,但是业务要求同一个时刻只能有一个同样的脚本运行,此时就可以利用$$获取上次的运行的脚本进程号,当程序重新运行时候,根据所得进程号,清理掉上一次的进程,运行新的脚本命令,脚本如下:
root@ubuntu:/shell# cat cmz.sh #!/bin/bash pidpath=/tmp/cmz.pid if [ -f "$pidpath" ];then kill $(cat $pidpath)>/dev/null 2>&1 rm -rf $pidpath fi echo $$>$pidpath sleep 100
测试:
#第一次后台运行 root@ubuntu:/shell# sh cmz.sh & [5] 5232 root@ubuntu:/shell# cat /tmp/cmz.pid 5232 [4]- Terminated sh cmz.sh root@ubuntu:/shell# ps -ef |grep cmz.sh root 5232 5063 0 10:56 pts/1 00:00:00 sh cmz.sh root 5238 5063 0 10:56 pts/1 00:00:00 grep --color=auto cmz.sh #第二次后台运行 root@ubuntu:/shell# sh cmz.sh & [6] 5239 root@ubuntu:/shell# cat /tmp/cmz.pid 5239 [5]- Terminated sh cmz.sh root@ubuntu:/shell# ps -ef |grep pid.sh root 5239 5063 0 10:56 pts/1 00:00:00 sh cmz.sh root 5245 5063 0 10:56 pts/1 00:00:00 grep --color=auto cmz.sh
从上面来看此时同一时刻只有一个进程在运行,此时在运行第二次时候,发现之前进程没运行结束,此时就kill掉,再次运行,要是必须运行完毕后在紧接着运行,代码需要稍微修改即可。