最近发现在使用下列命令启用单机多卡训练模型时,nohup.pid 文件只会记录下主进程的 pid。
python -m torch.distributed.launch xxx.py > nohup.log 2>&1& echo $! > nohup.pidshell当 kill 掉主进程时,仍然会有如下图所示的子进程残留

使用下列命令可以查看当前占用内存最多的 10 个进程并得到上图的结果
ps -aux | sort -k4nr | head -10shell下面是对命令的逐步解析:
ps -aux:ps:显示当前系统中运行的进程信息。-aux:a:显示所有用户的进程。u:以用户友好的格式显示(包括用户名、CPU、内存使用率等)。x:显示不依赖于终端的进程(如后台进程)。
|:- 管道符,将前一个命令的输出传递给下一个命令作为输入。
sort -k4nr:sort:对输入内容进行排序。-k4:按第 4 列进行排序(ps -aux的第 4 列通常是 内存 使用率%MEM)。n:按数值排序(而不是按字母表顺序)。r:按降序排序。
head -10:head:显示前几行内容。-10:只显示前 10 行。
观察输出结果可以发现,这些进程的启动命令都包含同样的字符串 from multiprocessing.forkserver import main;
使用下列命令可以批量 kill 包含同样字符串的进程
ps aux | grep "multiprocessing.forkserver import main" | grep -v grep | awk '{print $2}' | xargs kill -9shellps aux显示所有进程grep "multiprocessing.forkserver import main"过滤包含目标字符串的行grep -v grep排除 grep 命令本身awk '{print $2}'提取进程 IDxargs kill -9终止这些进程