当前位置: 首页 > news >正文

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

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

http://www.lryc.cn/news/96100.html

相关文章:

  • vscode中python插件过新导致无法正常debug问题解决安装vscode以前版本python插件教程
  • chrome macos编译
  • Linux环境下Elasticsearch相关软件安装
  • 【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7
  • 基于 Docker + Nginx + Gitlab-runner 实现前端自动化部署流程
  • make/makefile的使用
  • Flutter中Navigator 跳转传参数和反向传参数
  • kettle开发-Day40-AI分流之case/switch
  • MySQL下载与安装
  • c++基础2
  • 虚拟机VMware,linux,centos,如何将项目部署到服务器上面
  • R语言 BPNN 反向传播神经网络
  • 回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测
  • Qt使用QPixmap类和QScreen类来实现简单截图功能
  • 【【51单片机LCD1602模块介绍】】
  • 【Nginx11】Nginx学习:HTTP核心模块(八)文件处理
  • STM32MP157驱动开发——按键驱动(休眠与唤醒)
  • 全面解析 SOCKS5 代理与 HTTP 代理的对比与应用
  • STM32 HEX文件和BIN文件格式区别keil中的配置与生成
  • RabbitMQ优先级队列的使用
  • MAC 推送证书不受信任
  • Gitee创建分支
  • 集群间ssh配置免密登录
  • YOLOV8改进:CVPR 2023 | SCConv: 即插即用的空间和通道重建卷积
  • 人员定位安全管控系统:提升安全管理水平的智能解决方案
  • 数据结构(二)
  • logback 自定义log字段(MDC)推送到logstash(spring boot + logback+ logstash)
  • 1253. 重构 2 行二进制矩阵
  • 安全—01day
  • 【Git】Please commit your changes or stash them before you merge的解决方法