Shell脚本的运行方式总结
背景
这几天写shell,需要捞取在跑的Java进程。
shell中我需要传入两个参数,标识各模块名称,再使用ps -ef|grep java
进行捞取。
由于shell两个参数都是java。shell参数java与grep java
一致,而bash运行的会多两个运行运程(实际上是子shell),bash shell脚本
启动会莫名多出两个PID
如:
使用bash -x调试,可以看到1930、4463、4464四个Pid
直接用ps,看不出来4463、4464两个进程。直接使用ps也看不到
简单复现
-
使用java -jar启动java程序
-
使用shell捞取在运行时的程序
#!/bin/shell
#filename=get_main_PID
get_main_PID(){
mainProcessName=$1
echo "===original==="
temp=$(ps -ef|grep $mainProcessName|grep -v grep)
echo "$temp"
echo "===grep bash===="
temp1=$(ps -ef|grep $mainProcessName|grep -v grep|grep -v bash)
echo "$temp1"
}
get_main_PID $1
- 使用三种方式启动
使用bash的话,会多出两个进程。这就是两个PID的由来。
shell的启动方式总结
. shell脚本
启动:再当前shell环境中执行脚本bash shell脚本
j启动:在子shell中启动并执行脚本
总结
- 善于使用调试工具,逐步缩小定位范围
- 多学习多积累。基础不牢,定位时间太久了