
linux shell脚本对未定义变量的判断以及if的用法
需要查找进程ID 需要手动杀死进程 需要启动新的程序 进程过滤规则:根据实际场景调整 运行参数:根据实际需求调整Java启动命令。 后台启动方式:可以根据实际需求选择不同的后台启动方式。
发布日期:2021-05-07 04:26:15
浏览次数:24
分类:精选文章
本文共 1586 字,大约阅读时间需要 5 分钟。
Shell脚本优化:自动化进程杀死与程序启动
背景
在实际工作中,经常需要处理程序的进程管理问题。例如,某些脚本程序在启动前需要确保没有其他进程占用资源,或者需要清理掉之前的进程占用。以下是一个典型的场景:
公司有一款名为“ggjob-search”的程序,它需要通过脚本自动化启动。每次启动前,需要先查找当前运行的进程ID(PID),然后杀死对应的进程,最后启动新的程序实例。
问题描述
每次手动操作会非常繁琐:
这种繁琐的操作容易出错,且随着时间的推移,操作的复杂性只会增加。
解决方案
通过Shell脚本实现自动化处理,解决上述问题。以下是优化后的脚本代码:
#!/bin/bashecho "ggjob-search..."pid=$(ps -ef | grep -w ggjob-search | grep -v grep | grep -v ggjob-search.sh | awk '{printf $2}')echo "having kill pid:$pid"# 判断进程是否存在if [ -z "$pid" ]; then echo "pid variable is not set or undefined" exit 1else kill -9 $pidfi# 后台启动程序nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>&1 >> /dev/null & echo "new pid:$!"
解释
脚本开头:声明脚本的解释性说明,确保脚本的可读性。
查找进程ID:
- 使用
ps -ef
命令获取正在运行的进程列表。 - 使用
grep -w ggjob-search
过滤出与“ggjob-search”相关的进程。 - 使用
grep -v grep
排除grep
命令本身的进程。 - 使用
grep -v ggjob-search.sh
排除脚本本身临时启动的进程。 - 使用
awk '{printf $2}'
提取进程ID并赋值给变量pid
。
判断变量是否存在:
- 使用
if [ -z "$pid" ]
判断pid
变量是否为空。 - 如果
pid
为空,提示用户“pid变量不为空”并退出脚本。 - 如果
pid
存在,执行kill -9 $pid
命令,强制终止对应的进程。
后台启动程序:
- 使用
nohup
命令将输出重定向到/dev/null
,避免输出到终端。 - 使用
>> /dev/null &
将启动结果的错误信息也重定向到/dev/null
。 - 最后使用
echo "new pid:$!"
打印新的进程ID。
优化点
简化条件判断:
- 使用
[ -z "$pid" ]
来判断pid
是否为空,简洁且直观。 - 如果
pid
未定义,直接退出脚本,避免后续命令无法执行。
错误处理:
- 在
pid
未定义时,脚本会立即退出,避免因未定义变量导致错误。 - 使用
exit 1
确保脚本在遇到问题时能够优雅退出。
脚本可读性:
- 注释清晰,代码结构分明,便于阅读和理解。
- 每个步骤都有明确的注释,方便后续维护和修改。
实际应用
在实际使用中,可以根据具体需求调整以下内容:
grep
过滤条件。通过上述优化,脚本的执行效率得到了显著提升,减少了人为错误,且代码结构更加清晰易读。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月23日 05时34分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
项目计划甘特图绘制说明
2019-03-12
1004.串口收发数据集成bug
2019-03-12
09.QT应用程序启动外部exe文件
2019-03-12
1009. clion调试段错误
2019-03-12
C/C++:线性表之顺序表
2019-03-12
嵌入式系统试题库(CSU)
2019-03-12
图神经网络7日打卡营学习心得
2019-03-12
electronJS 开发linux App
2019-03-12
STM32F7 LWIP协议栈TCP速度测试
2019-03-12
Arm Mbed OS 更适合大学实训平台
2019-03-12
MbedOS 设备中的模数转换(ADC)
2019-03-12
MbedOS+MQTT+TICK 栈构建企业大数据平台
2019-03-12
C++ influxdb 客户端
2019-03-12
关于编程能力的思考
2019-03-12
【vue】setInterval的嵌套实例
2019-03-12
【SpringBoot】如何配置热部署
2019-03-12
【rabbitMQ】04 如何实现高可用?
2019-03-12
【自考】之信息资源管理(一)
2019-03-12