2、Linux基础回顾:Shell、权限、环境变量与进程管理
说实话,很多搞集群运维的朋友,栽跟头往往不是栽在高深的调度算法上,而是栽在 Linux 基本功上。一个权限没设对,一条命令少了个符号,进程就跑了,作业就挂了。
所以,咱们这一章不聊虚的。我带你快速过一遍在集群环境里真正会用到的 Linux 基础。放心,不讲那些看着永远用不上的冷门参数。
2.1 Shell 命令:高频三板斧
平时管理节点、排查问题,你用不了多少复杂命令。我个人习惯,把下面这堆练成本能反应就够了。
文件与目录操作
ls -lah # 看文件大小、权限、修改时间
cd - # 跳回上一个目录,非常实用
mkdir -p a/b/c # 递归创建,省得一层层建
cp -rp # 保留权限、递归复制,拷贝作业目录时必用
scp -r # 跨节点拷贝,集群标配
文本处理三剑客
grep -rn "error" /var/log/ # 递归搜索错误关键字
awk '{print $1, $3}' log # 打印第一列和第三列
sed -i 's/old/new/g' file # 直接替换,慎用 -i
为什么要强调这个?想想看,一个集群里有上千条作业记录,你手动翻文件?不现实。一个 grep 上去,几秒钟定位问题。
2.2 文件权限:坑踩得最多的地方
嗯,这里要注意。很多用户在集群上提交作业失败,原因就是一个简单的权限没放开。
权限表示法
| 符号 | 含义 | 分值 |
|---|---|---|
| r | 读 | 4 |
| w | 写 | 2 |
| x | 执行 | 1 |
举个例子,chmod 755 script.sh,意思就是:你自己能读写执行,同组的人能读能执行,其他人只能读。
umask
这玩意控制新文件默认权限。比如 umask 022,新文件就是 644,目录就是 755。集群环境里,统一 umask 能省掉一堆麻烦。
2.3 环境变量:配置好,少折腾
说白了,环境变量就是告诉系统去哪找东西。在集群上,最核心的变量大概是这几个:
export PATH=$PATH:/opt/slurm/bin # 把调度器命令加入路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 # CUDA库路径
export OMP_NUM_THREADS=4 # OpenMP 线程数
我建议你把集群软件相关的环境变量统一写在 /etc/profile.d/ 或者你个人的 ~/.bashrc 里。不要到处乱放,到时候找不到命令就很尴尬。
echo $PATH 看当前路径,用 which squeue 看命令具体位置。其实很多"命令找不到"的问题,一查就知道是环境变量没生效。
2.4 进程管理:ps、kill、nohup
进程管理是集群运维的基本功。你提交的作业其实就是一个或者一堆进程在跑。
ps 查看进程
ps aux # 查看所有进程的详细信息
ps -ef | grep slurm # 过滤出调度器进程
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu # 按CPU占用排序,一眼看出谁在吃资源
我个人习惯用 ps aux --forest,可以看出进程的父子关系。这在排查僵尸进程时特别好用。为什么会这样?因为僵尸进程的父进程通常是 init,顺着树一看你就明白了。
kill 控制进程
kill -9 PID # 强制杀死(别轻易用)
kill -15 PID # 优雅退出,给进程清理机会
kill -HUP PID # 让配置生效,不用重启
nohup 后台运行
集群上很多任务要跑好几天,一个 ssh 断开就尴尬了。
nohup ./big_job.sh > job.log 2>&1 &
# nohup: 忽略挂断信号
# > job.log: 标准输出重定向
# 2>&1: 错误也发到同一文件
# &: 放到后台
还有一点,disown 可以把已经跑起来的任务从 shell 上脱离。
2.5 SSH 无密码登录配置
集群管理节点之间、计算节点之间,靠的就是无密码登录。手动输密码会把你搞疯的。
步骤很简单:
- 生成密钥对
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
- 把公钥发给目标机器
ssh-copy-id user@node2
- 验证
ssh node2 "hostname"
ssh-copy-id 用不了,手动也行:
cat ~/.ssh/id_rsa.pub | ssh user@node2 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
避坑指南:
~/.ssh目录权限必须是 700,authorized_keys是 600。我遇到过权限太松,SSH 直接拒绝连接的情况,花了我一下午排查。- 如果做了
chmod还是不行,看看 SELinux 或者/etc/ssh/sshd_config里的PubkeyAuthentication yes有没有开启。 - 集群规模大时,建议用 ssh-agent 管理密钥,省得每个节点都拷一遍。
下面这张图,帮你把这一章的知识点串起来。你想想看,从敲命令到进程管理,再到节点间信任,每一环都扣着集群的日常运维。
这一块内容其实不难,但一定要练熟了。后面的集群配置、作业调度、监控脚本,全是靠这些基本命令堆出来的。嗯,打好基础,接下来就顺了。