面试题答案
一键面试脚本内部优化
- 减少I/O操作
- 合并多次文件读写:如果脚本需要多次读取同一个文件,将文件内容一次性读入内存,而不是多次打开和读取。
data=$(cat file.txt) # 后续操作使用 $data 变量,而不是每次都读取 file.txt
- 减少不必要的打印输出:频繁的
echo
操作会产生I/O开销,只在必要时输出信息。
- 合理使用变量作用域
- 局部变量:在函数内部尽量使用局部变量,避免污染全局命名空间,也有助于提高脚本的可读性和维护性。
my_function() { local localVar="This is a local variable" echo $localVar }
脚本之间的并发控制
- 使用进程池
- xargs 结合 -P 参数:
xargs
命令可以从标准输入读取数据,并将其作为参数传递给其他命令。-P
参数用于指定最大并行度,从而实现进程池的效果。
# 假设 scripts.txt 包含要执行的脚本列表 cat scripts.txt | xargs -P $(nproc) bash
- GNU Parallel:这是一个更强大的并行执行工具,它可以方便地控制并行任务的数量,并处理任务的输入输出。
# 安装 GNU Parallel # 在 Ubuntu 上:sudo apt install parallel parallel :::./script1.sh./script2.sh./script3.sh
- xargs 结合 -P 参数:
- 信号处理
- 使用 trap 命令:可以利用
trap
命令来处理信号,例如在脚本接收到SIGTERM
信号时,优雅地停止正在执行的任务。
cleanup() { echo "Received SIGTERM, cleaning up..." # 在这里添加清理任务,如终止子进程等 } trap cleanup SIGTERM # 脚本的主要执行部分 # 例如启动多个后台进程 ./long_running_script1.sh & pid1=$! ./long_running_script2.sh & pid2=$! wait $pid1 $pid2
- 使用 trap 命令:可以利用
利用多核资源
- 多核并行执行
- 如上述使用
xargs -P $(nproc)
或parallel
的示例,直接利用系统的核数来并行执行脚本,充分发挥多核CPU的性能。
- 如上述使用
- 任务拆分
- 将大的任务拆分成多个小的子任务,每个子任务可以独立并行执行。例如,如果有一个处理大数据集的脚本,可以将数据集按一定规则拆分,每个子任务处理一部分数据。
这里将# 假设 data.txt 是大数据集文件 split -l 1000 data.txt data_part_ for part in data_part_*; do ./process_data.sh $part & done wait
data.txt
按每1000行拆分成多个文件,然后并行处理每个文件。