如何查找ksh脚本执行时调用的所有脚本及配置文件
追踪KSH脚本调用的所有脚本与配置文件
嘿,这个场景我太熟了——多层嵌套的脚本和散落的配置文件确实难找全,分享几个我常用的方法,从动态追踪到静态分析都有:
1. 用strace动态追踪所有系统调用
这是最全面的方法,能抓到脚本执行过程中所有打开的文件(包括配置)和执行的子脚本,不管路径是硬编码还是动态生成的。
执行命令:
strace -e open,execve -f -o script_trace.log ./your_main_script.ksh
参数说明:
-e open,execve:只追踪文件打开(open)和进程执行(execve)这两个关键系统调用,减少无关输出-f:追踪主进程的所有子进程(因为嵌套脚本会启动子shell)-o script_trace.log:把结果输出到日志文件,方便后续分析
分析日志的技巧:
- 找所有执行的脚本:
grep 'execve("' script_trace.log,结果里会显示脚本的绝对路径 - 找所有打开的配置文件:
grep 'open(".*\.\(conf\|cfg\|ini\)"' script_trace.log,可以根据你的配置文件后缀调整正则 - 过滤掉系统无关文件:比如加上
| grep -v "/dev/" | grep -v "/etc/passwd",排除/dev下的设备文件或系统配置
2. 用KSH内置调试模式输出执行细节
如果不想用系统级工具,KSH自带的调试功能也能帮你理清调用链,适合快速排查。
启动调试模式执行主脚本:
ksh -x ./your_main_script.ksh > script_debug.log 2>&1
或者在主脚本开头加上set -x,这样脚本执行时会输出每一步的命令(包括调用的脚本和读取的文件)。
分析日志的技巧:
- 找嵌套调用的脚本:搜索
+ .(source命令)或+ exec或+ ksh,这些行后面跟着的就是被调用的脚本路径 - 找配置文件:搜索读取文件的命令,比如
+ cat、+ read,或者直接搜常见配置后缀conf、cfg
3. 静态分析脚本内容(适合无执行权限的场景)
如果没法直接执行脚本,或者想先做静态排查,可以用grep递归搜索所有脚本里的调用关系和配置引用。
找所有被调用的脚本
先从主脚本开始,搜索常见的调用语法:
grep -E '^\. |^source |^exec |^ksh |^bash ' your_main_script.ksh
然后对找到的每个子脚本重复这个命令,或者用递归搜索:
grep -rE '^\. |^source |^exec |^ksh ' ./script_directory/
找所有引用的配置文件
搜索脚本里的配置文件后缀或读取文件的逻辑:
grep -rE '\.(conf|cfg|ini)$' ./script_directory/ # 或者找读取文件的命令 grep -rE 'cat |read < |while read' ./script_directory/ | grep -v 'dev/null'
注意:这种方法可能会漏动态生成的路径(比如用变量拼接的文件路径),所以最好结合动态追踪一起用。
4. 小技巧:用ps实时追踪进程树
如果脚本执行时间较长,还可以用ps命令实时查看进程链,找到所有子脚本:
ps -ef --forest | grep -E 'ksh|your_main_script'
--forest参数会以树形结构显示进程关系,能直观看到主脚本调用的所有子进程。
内容的提问来源于stack exchange,提问作者Arun Aranganathan
相关产品推荐
相关产品推荐

