2、Linux基础回顾:Shell、权限、环境变量与进程管理

说实话,很多搞集群运维的朋友,栽跟头往往不是栽在高深的调度算法上,而是栽在 Linux 基本功上。一个权限没设对,一条命令少了个符号,进程就跑了,作业就挂了。

所以,咱们这一章不聊虚的。我带你快速过一遍在集群环境里真正会用到的 Linux 基础。放心,不讲那些看着永远用不上的冷门参数。

2.1 Shell 命令:高频三板斧

平时管理节点、排查问题,你用不了多少复杂命令。我个人习惯,把下面这堆练成本能反应就够了。

文件与目录操作

ls -lah            # 看文件大小、权限、修改时间
cd -               # 跳回上一个目录,非常实用
mkdir -p a/b/c     # 递归创建,省得一层层建
cp -rp             # 保留权限、递归复制,拷贝作业目录时必用
scp -r             # 跨节点拷贝,集群标配

文本处理三剑客

我在排查调度器日志时,经常靠 awk 和 grep 的组合秒杀问题。比如只看某个用户的报错行,再用 awk 截出时间戳。
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,意思就是:你自己能读写执行,同组的人能读能执行,其他人只能读。

千万不要用 chmod 777,尤其在作业目录和共享存储上。我曾经见过一个集群,因为有人对/home下的公用目录设了 777,结果其他用户的敏感数据全部暴露了,还好发现得早。

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    # 让配置生效,不用重启
kill -9 有点像直接拔电源,很暴力。如果进程在写文件,数据可能就丢了。我建议先 kill -15,等个几秒,不行再kill -9.

nohup 后台运行

集群上很多任务要跑好几天,一个 ssh 断开就尴尬了。

nohup ./big_job.sh > job.log 2>&1 &
# nohup: 忽略挂断信号
# > job.log: 标准输出重定向
# 2>&1: 错误也发到同一文件
# &: 放到后台

还有一点,disown 可以把已经跑起来的任务从 shell 上脱离。

2.5 SSH 无密码登录配置

集群管理节点之间、计算节点之间,靠的就是无密码登录。手动输密码会把你搞疯的。

步骤很简单:

  1. 生成密钥对
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
  1. 把公钥发给目标机器
ssh-copy-id user@node2
  1. 验证
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 管理密钥,省得每个节点都拷一遍。

下面这张图,帮你把这一章的知识点串起来。你想想看,从敲命令到进程管理,再到节点间信任,每一环都扣着集群的日常运维。

Linux 基础回顾 · 核心知识体系 集群环境 Shell 命令 文件权限 环境变量 进程管理 SSH 无密码 ⚠ 核心关系 Shell 命令操作权限与进程,环境变量链接工具,SSH 打通节点互信

这一块内容其实不难,但一定要练熟了。后面的集群配置、作业调度、监控脚本,全是靠这些基本命令堆出来的。嗯,打好基础,接下来就顺了。