Ubuntu如何查看SSH断开重连后后台进程的实时输出日志
问题根因
使用&将进程放入后台时,进程的标准输出、标准错误默认仍绑定当前SSH会话对应的虚拟终端,会话断开后新登录的会话无法直接读取原终端的输出。你之前执行reptyr报错,是因为传入的是sudo进程的PID,实际运行业务的mortar进程是sudo的子进程(即报错中提到的PID 6461),跨进程组attach父进程会触发权限限制。
已运行进程的日志查看方案
- 直接读取进程文件描述符(无额外依赖,推荐)
先过滤出mortar业务进程的真实PID,不要用sudo进程的PID:
拿到PID后直接读取进程对应的输出文件描述符,即可实时查看所有日志:ps aux | grep "[m]ortar server"
其中# 将<PID>替换为上一步查到的mortar进程实际PID sudo tail -f /proc/<PID>/fd/1 /proc/<PID>/fd/2/proc/<PID>/fd/1对应进程标准输出,/proc/<PID>/fd/2对应进程标准错误,所有运行时打印的内容都会实时输出到这两个描述符,tail -f会持续追踪新增内容。 - 修正reptyr参数attach子进程
先临时放开ptrace限制,再直接attach真实的mortar子进程即可:
attach成功后当前shell会直接接管该进程的输入输出,和在当前shell直接启动节点的效果完全一致。如果需要把进程放回后台继续运行,按sudo sysctl -w kernel.yama.ptrace_scope=0 # 替换<PID>为mortar进程真实PID sudo reptyr <PID>Ctrl+Z暂停进程后执行bg即可。
后续启动的持久化方案
下次启动节点不要直接用&裸跑,选以下任意一种方式,避免会话断开后丢失日志:
- nohup重定向日志到文件
启动时直接把输出写入固定日志文件,会话断开不会影响进程运行:
后续查看日志直接执行sudo nohup mortar server --data-dir ./data-dir --chain genesis.json --libp2p 0.0.0.0:PORT --nat IP-ADDRESS --seal --price-limit 1 > ./mortar-node.log 2>&1 &sudo tail -f ./mortar-node.log即可。 - screen/tmux持久化终端会话
以screen为例,先安装工具:
新建专属会话:sudo apt update && sudo apt install -y screen
在弹出的会话窗口中直接执行节点启动命令(不需要加&),启动完成后按screen -S mortar-nodeCtrl+A再按D即可临时退出会话,节点会在后台持续运行。下次登录后执行screen -r mortar-node就能直接回到节点运行的终端界面,查看所有历史输出。 - systemd托管(生产环境推荐)
将节点配置为系统服务,支持开机自启、异常自动重启、日志统一管理。
新建服务配置文件:
写入以下配置,注意替换WorkingDirectory、User、启动参数为你实际环境的值:sudo nano /etc/systemd/system/mortar-validator.service
保存退出后重载配置、启动服务并设置开机自启:[Unit] Description=Mortar Validator Node After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/mortar ExecStart=/usr/local/bin/mortar server --data-dir ./data-dir --chain genesis.json --libp2p 0.0.0.0:PORT --nat IP-ADDRESS --seal --price-limit 1 Restart=on-failure RestartSec=3 LimitNOFILE=65535 [Install] WantedBy=multi-user.target
后续查看日志直接调用journalctl即可,支持实时追踪、时间过滤、关键词搜索:sudo systemctl daemon-reload sudo systemctl enable --now mortar-validator# 实时查看最新日志 sudo journalctl -u mortar-validator -f
内容的提问来源于stack exchange,提问作者cormacncheese
相关产品推荐
相关产品推荐

