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" ];then
    kill `cat $pidpath` >/dev/null 2>&1
    rm -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

脚本用于执行启动或定时任务时,相同的脚本只能有一个在运行,当新脚本运行时,必须关闭未运行完或未退出的上一次同名的脚本进程。

你可能感兴趣的:(Shell,linux)