实验室常用terminal命令

发布于

看自己的进程占用了多少显存

抓取当前占用显卡的 PID 并打印详情

ps -fp $(nvidia-smi --query-compute-apps=pid --format=csv,noheader)\


(base) root@whu-lab:~# ps -fp $(nvidia-smi --query-compute-apps=pid --format=csv,noheader)
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
whu         3706    3437  0 9月21 ?       SLsl  10:24 /usr/libexec/gnome-remote-desktop-daemon
whu      3419713 3419712 99 18:39 pts/1    Rl    20:37 /home/whu/miniconda3/envs/infoopt_dl/bin/python -u /home/whu/disk1/ITSL_stage4_prep_20261014_v2/snapshot/train.py
root     3433183 3433177 93 18:49 pts/8    Rl+    3:23 python3 -m dgpm.cli vlm_baseline --config configs/vlm_b1_b3.yaml --output runs/V01_B1

zip

zip -r /保存的目标路径/xx.zip /要压缩的源路径
zip -r /home/user/backup/xx.zip /var/www/html

## 上述命令会带有长原始层级
# 方式 A:只打包 my_folder 文件夹本身
cd /path/to
zip -r /target/location/xx.zip my_folder

# 方式 B:打包当前目录下的所有内容(不包含最外层 my_folder 目录名)
cd /path/to/my_folder
zip -r /target/location/xx.zip .

优雅detatch

在进程已经开始运行且正在向终端刷屏幕的情况下,如果直接关终端,进程会收到 SIGHUP 信号被终止,且输出也会丢失。

你可以通过以下 3 步(无需重启进程),将其安全地放入后台,并防止终端关闭时被杀掉,同时把输出重定向保存到文件:


第一步:暂停当前任务并放入后台

  1. 在当前正在运行的终端中,按下键盘组合键:
    Ctrl + Z
    (此时屏幕会停止滚动,终端会提示 [1]+ Stopped python xxx.py,任务被暂时挂起)

  2. 输入以下命令,让它在后台继续运行:

    bg
    

    (你会看到提示类似 [1]+ python xxx.py &,任务恢复运行)

  3. 输入以下命令,防止终端关闭时该进程被杀死(关键步骤):

    disown -h %1
    

    (如果你挂起的任务编号是 [1],就写 %1;如果不知道编号,直接运行 disown -h 默认对最后一个任务生效)


第二步:将终端输出重定向到本地日志文件

因为进程启动时没有用 > 或 tee 重定向输出,此时它依然会往标准输出(已关闭的终端)写日志,导致日志丢失。你可以借助 Linux 提供的调试工具 reptyr 或 重定向文件描述符 来捕获后续日志。

最稳妥、不需要安装额外工具的方法是使用 reredirect 或直接用重定向工具,但如果没有 root 权限,最推荐安装一个小工具 reptyr(或者把已有输出用最简单的系统级方式接管):

推荐方案(如果有 sudo 权限,最优雅):

安装 reptyr 将已经运行的进程直接抓取进一个 screen 或 tmux 会话:

# 1. 安装 (Ubuntu/Debian)
sudo apt-get install reptyr

# 2. 新建一个 tmux 或 screen
tmux new -s my_train

# 3. 把已经后台运行的进程“偷”过来(替换为你训练进程的 PID)
reptyr <你的PID>

这样你不仅能随时关闭终端,甚至下次还能随时连回来(tmux attach -t my_train)继续看 tqdm 进度条实时刷新!


免安装快速方案(利用 GDB 重定向输出到文件):

如果服务器不能联网安装新包,但机器通常自带 gdb:

  1. 查看你的进程 PID(比如 123456)。
  2. 执行以下脚本,直接在内核层把进程的标准输出(fd 1)和标准错误(fd 2)重定向到 train.log:
gdb -p 123456 -batch \
 -ex 'call close(1)' \
 -ex 'call open("train.log", 66, 0666)' \
 -ex 'call close(2)' \
 -ex 'call dup(1)' \
 -ex 'detach' \
 -ex 'quit'

执行后,该进程之后所有的 print 和 tqdm 输出都会自动写入同目录下的 train.log 中。


第三步:安全关闭终端

完成上述操作后:

  1. 不要直接强行点右上角的 X(某些 SSH 客户端直接关窗口偶尔仍会导致断开信号透传)。
  2. 在终端中输入:
    exit
    
    正常登出。

之后你想看日志,只需重新登录服务器,运行:

tail -f train.log

就能持续追踪日志了。


💡 下次启动时的预防经验(避免这么折腾):
下次再跑代码时,强烈建议一开始就养成使用 tmux / screen 或 后台运行命令 的习惯:

nohup python -u xxx.py > train.log 2>&1 &

(注:-u 参数非常重要,能禁用 Python 的输出缓冲,让 tqdm 和 print 能立即实时刷入日志文件,而不是卡着不写)

评论区 (0)