Shell脚本学习-$$特殊变量
$$特殊变量:
获取脚本执行的进程号(PID)。
[root@vm1 scripts]# cat test_pid.sh
echo $$ > /tmp/a.pid
sleep 300
代码说明:
1)获取$$值,也就是当前脚本进程的PID值,重定向到/tmp/a.pid文件中。
2)休息300秒,模拟守护进程不退出。
[root@vm1 scripts]# sh test_pid.sh &
[1] 10638
[root@vm1 scripts]# ps -ef |grep test_pid|grep -v grep
root 10638 5135 0 04:51 pts/0 00:00:00 sh test_pid.sh
[root@vm1 scripts]# cat /tmp/a.pid
10638
代码说明:
1)然后我们在后台运行脚本,&符号表示在后台运行脚本。
2)然后我们使用ps命令查看进程号,位10638。
3)然后我们检查/tmp/a.pid文件,看其中的内容就是进程号。
生产环境案例:
实现系统中多次执行一个脚本后的进程只有一个。$$特殊变量的企业级应用。
说明:有时执行定时任务脚本的频率比较快,并不知道上一个脚本是否真的执行完毕。但是业务要求同一时刻只能有一个同样的脚本在运行。此时可以利用$$获取上一次运行的脚本进程号,当程序重新运行时候,根据获得的进程号,清理掉上一次的进程,运行新的脚本命令。
[root@vm1 scripts]# cat pid.sh
#!/bin/bash
pidpath=/tmp/a.pid
if [ -f "$pidpath" ];thenkill `cat $pidpath` >/dev/null 2>&1rm -f $pidpath
fi
echo $$ > $pidpath
sleep 300
说明:
1)使用-f "$pidpath"语句是判断 $pidpath变量的文件是否存在,存在说明有脚本进行在运行。
2)杀掉与前一个进程号对应的进程。将显示信息和错误信息都放到/dev/null黑洞文件中。
2)使用rm -f $pidpath语句删除掉pid文件。
3)然后再将当前的进程号重定向到/tmp/a.pid文件中。
4)休息300秒。
我们再进行下测试:
[root@vm1 scripts]# ps -ef |grep pid.sh |grep -v grep
[root@vm1 scripts]# sh pid.sh &
[1] 26178
[root@vm1 scripts]# ps -ef |grep pid.sh |grep -v grep
root 26178 5135 0 05:10 pts/0 00:00:00 sh pid.sh
[root@vm1 scripts]# sh pid.sh &
[2] 26362
[root@vm1 scripts]# ps -ef |grep pid.sh |grep -v grep
root 26362 5135 0 05:10 pts/0 00:00:00 sh pid.sh
[1]- Terminated sh pid.sh
[root@vm1 scripts]# sh pid.sh &
[3] 26659
[root@vm1 scripts]# sh pid.sh &
[4] 26663
[2] Terminated sh pid.sh
[root@vm1 scripts]# ps -ef |grep pid.sh |grep -v grep
root 26663 5135 0 05:10 pts/0 00:00:00 sh pid.sh
[3]- Terminated sh pid.sh
脚本用于执行启动或定时任务时,相同的脚本只能有一个在运行,当新脚本运行时,必须关闭未运行完或未退出的上一次同名的脚本进程。