Shell 与 Python 运维脚本

共 17 题
#

1. Shell 脚本的健壮性中 set -euo pipefail 与错误处理如何配合?

A set -u 与变量无关
B set -e 会阻止 if 语句执行
C 管道默认返回中间命令的退出码
D set -e 失败即退、-u 未定义变量报错、-o pipefail 让管道返回非零成员退出码,但 if 条件中的失败不受 set -e 影响 ✓ 正确答案
#

2. Python 脚本中 asyncio 如何提升高 IO 场景的并发吞吐?

A 事件循环可以自动识别同步阻塞调用
B asyncio 适合 CPU 密集计算
C 协程在 await IO 等待时让出控制权,单线程并发处理大量 IO,但同步阻塞调用会阻塞整个事件循环 ✓ 正确答案
D asyncio 需要多线程配合才能并发 IO
#

3. Python 脚本中 concurrent.futures 如何实现并发任务?

A 进程池与线程池性能完全相同
B 线程池适合 IO 密集(GIL 在阻塞时释放),进程池绕过 GIL 适合 CPU 密集并行 ✓ 正确答案
C map 与 as_completed 语义相同
D Future.result() 不会阻塞
#

4. Python 脚本中 multiprocessing 如何利用多核处理 CPU 密集任务?

A lambda 函数可以直接作为进程任务
B 多进程仍受 GIL 限制
C 子进程与主进程共享全部内存
D 进程池通过多进程绕过 GIL 并行利用多核,参数经 pickle 传递,Windows/macOS 需 spawn 并保护主入口 ✓ 正确答案
#

5. Python 脚本中 pathlib 如何简化路径处理?

A glob 与 rglob 功能完全相同
B pathlib 只能处理 POSIX 路径
C Path 对象不能传给 open 函数
D Path 用 / 运算符拼接路径,提供 read_text/glob/mkdir 等封装,跨平台自动处理分隔符 ✓ 正确答案
#

6. Python 脚本中 retry/tenacity 如何实现重试与退避策略?

A 所有异常都应无限重试
B stop 控制停止条件、wait 控制间隔(指数+抖动防重试风暴)、retry 控制触发条件,且重试只适合幂等操作 ✓ 正确答案
C 抖动会加剧下游压力
D 重试不需要超时配合
#

7. Python 脚本中 subprocess 如何实现子进程?

A shell=True 永远更安全
B 参数列表方式默认不经 shell 解析,避免注入;run 的 check/timeout/capture_output 提供健壮错误处理 ✓ 正确答案
C communicate 与管道死锁无关
D 捕获输出不会消耗内存
#

8. Python 运维脚本的工程化要点中 argparse 参数校验、logging 分级输出与异常兜底策略如何设计

A 退出码只表示 0/非0 即可
B print 足够满足生产日志需求
C argparse 在运行前校验参数,logging 分级输出,main 返回退出码并在顶层分类捕获异常,形成可运维脚本 ✓ 正确答案
D 参数错误应在运行中再发现
#

9. crontab 环境变量缺失导致脚本手动可跑但 cron 失败的排查路径中 PATH、SHELL、HOME、MAILTO 的常见陷阱

A MAILTO 与 cron 失败无关
B cron 会加载用户 .bashrc
C 手动执行正常则 cron 一定正常
D cron 在精简环境运行(默认 PATH 很小、无登录环境变量),脚本需显式设置环境并使用绝对路径与日志重定向 ✓ 正确答案
#

10. shell 函数中 local、typeset 如何限定变量作用域?

A local 变量会传播到管道子 shell
B 函数内变量默认是局部的
C local 把变量限定为函数局部并遮蔽全局,防止污染,但命令替换与管道子 shell 中不生效 ✓ 正确答案
D local 只能用于 POSIX sh
#

11. shell 脚本中 flock 如何实现文件锁以防止脚本并发执行?

A 进程被杀后 flock 锁会残留
B flock 锁文件内容必须匹配进程名
C flock 基于内核文件锁,进程退出自动释放,-n 非阻塞模式适合 cron 防重入,优于 pidfile 锁 ✓ 正确答案
D flock 可用于跨主机互斥
#

12. shell 脚本中 getconf 如何获取系统配置常量(如页大小、参数上限)?

A getconf 从 POSIX 系统限制读取页大小、ARG_MAX、OPEN_MAX 等常量,便于脚本自适应与跨平台 ✓ 正确答案
B getconf 只能查询网络参数
C getconf 与 ulimit 数据完全无关
D 页大小在任意平台都是 4096
#

13. shell 脚本中 mapfile、readarray 如何实现文件读入数组?

A 空行会被自动忽略
B mapfile 会按空格拆分每行
C 数组下标从 1 开始
D mapfile -t 把输入按行保真读入数组,避免 $(cat) 的分词与空白丢失,但管道写法中数组不会传递 ✓ 正确答案
#

14. shell 脚本中 关联数组 declare -A 如何实现 KV 结构?

A declare -A 声明键值对结构,支持任意字符串键,但要求 bash 4+、键序不确定、跨子 shell 需序列化 ✓ 正确答案
B 关联数组键只能是数字
C 所有 shell 都支持 declare -A
D 键的顺序是插入顺序
#

15. Shell/Python 脚本的命令注入防御中如何校验外部输入、避免 eval 与命令拼接并使用参数化方式执行外部命令

A 校验输入会降低性能所以可以不做
B 引号包裹拼接的输入就绝对安全
C os.system 是安全的执行方式
D 核心是数据与代码分离:白名单校验输入、禁用 eval/拼接、用参数列表方式执行外部命令 ✓ 正确答案
#

16. 文本处理性能选型中 awk/sed 与 Python 在流式大文件处理上的耗时与内存差异以及如何用基准测试验证

A Python 处理文本总是比 awk 快
B awk/sed 是 C 实现且流式处理、内存恒定,通常比 Python 逐行处理快;复杂逻辑才用 Python,并保持流式写法 ✓ 正确答案
C 内存占用与文件大小无关
D 小文件场景也应只按性能选型
#

17. 运维脚本的可维护性中函数拆分、shellcheck/pytest 静态与单元测试如何提升脚本质量

A 脚本不需要版本控制
B shellcheck 只能检查语法错误
C 函数拆分提升复用与可测性,shellcheck 做静态检查,pytest 对纯逻辑做单元测试并 mock 外部命令 ✓ 正确答案
D 单元测试只适用于 Web 应用