Linux - 命令alias grep "grep -r"引起的卡慢报错问题
问题描述
用户环境下有别名ml,实际命令是module load与其它包含grep的命令组成。
用户执行ml python
会停住,过了很久报了一堆奇怪的报错,加载失败。
问题分析
由于现象是加载工具时卡住,需要找到卡在哪里。然后再分析为何报错。
用户先开好两个shell,称为shellA与shellB,shellA进程ID为pid_A。
在shellB中,执行strace -ttTffy -o /tmp/${USER}_strace.log -p pid_A
在shellA中执行ml python
,
同时在shellB中,查看strace的日志,看生成的子进程分别是什么。有awk,grep等。
其中grep进程持续了很久,我觉得有问题。细看grep命令的调用,是grep -r
后面没有跟参数。这就引起了我的警觉:加载工具的过程,为何要递归过滤整个目录?这不合理!
等shellA报错退出后,我检查grep的别名设置,它是grep -r
,定义语句alias grep "grep -r"
是用户的初始化文件里头source的一个文件的语句。这个语句的问题在于,它仅仅支持文件夹递归过滤了,而不接收从stdin接收的字符串内容了。由于ml命令中包含了管道后接grep命令,这个命令失效,并从当前文件夹递归过滤文件内容,由于当前目录文件层级过深、文件很多,耗时当然很长。至于最后报错,因为要处理的不是期望的字符串,奇怪的报错也就意料之中了。
问题解决
本案要从两个方面来解决问题
- 告知用户,grep的别名不能加-r;
- 管理员的基础环境调用的命令,应不要受用户的alias影响,否则状况百出。具体可以使用绝对路径,或是在命令前加上反斜杠,如
\grep
。